检查字符串是否有效,以 Java 编码的 UTF-8
如何检查字符串是否采用有效的 UTF-8 格式?
只能检查字节数据。如果你构造了一个字符串,那么它在内部已经是UTF-16。
此外,只有字节数组可以进行 UTF-8 编码。
下面是 UTF-8 转换的常见情况。
String myString = "\u0048\u0065\u006C\u006C\u006F World";
System.out.println(myString);
byte[] myBytes = null;
try
{
myBytes = myString.getBytes("UTF-8");
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
System.exit(-1);
}
for (int i=0; i < myBytes.length; i++) {
System.out.println(myBytes[i]);
}
如果您不知道字节数组的编码,则 juniversalchardet 是一个库,可帮助您检测它。
以下帖子摘自官方 Java 教程,网址为:https://docs.oracle.com/javase/tutorial/i18n/text/string.html。
StringConverter 程序首先创建一个包含 Unicode 字符的字符串:
String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
打印时,名为 original 的字符串显示为:
AêñüC
若要将 String 对象转换为 UTF-8,请调用 getBytes 方法并将相应的编码标识符指定为参数。getBytes 方法返回 UTF-8 格式的字节数组。若要从非 Unicode 字节数组创建 String 对象,请使用编码参数调用 String 构造函数。进行这些调用的代码包含在 try 块中,以防不支持指定的编码:
try { byte[] utf8Bytes = original.getBytes("UTF8"); byte[] defaultBytes = original.getBytes(); String roundTrip = new String(utf8Bytes, "UTF8"); System.out.println("roundTrip = " + roundTrip); System.out.println(); printBytes(utf8Bytes, "utf8Bytes"); System.out.println(); printBytes(defaultBytes, "defaultBytes"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); }
StringConverter 程序打印出 utf8Bytes 和 defaultBytes 数组中的值,以演示一个重要观点:转换后的文本的长度可能与源文本的长度不同。一些 Unicode 字符转换为单个字节,其他字符转换为成对或三重字节。printBytes 方法通过调用 byteToHex 方法来显示字节数组,该方法在源文件 UnicodeFormatter.java 中定义。下面是 printBytes 方法:
public static void printBytes(byte[] array, String name) { for (int k = 0; k < array.length; k++) { System.out.println(name + "[" + k + "] = " + "0x" + UnicodeFormatter.byteToHex(array[k])); } }
下面是 printBytes 方法的输出。请注意,在两个数组中,只有第一个和最后一个字节(A 和 C 字符)相同:
utf8Bytes[0] = 0x41 utf8Bytes[1] = 0xc3 utf8Bytes[2] = 0xaa utf8Bytes[3] = 0xc3 utf8Bytes[4] = 0xb1 utf8Bytes[5] = 0xc3 utf8Bytes[6] = 0xbc utf8Bytes[7] = 0x43 defaultBytes[0] = 0x41 defaultBytes[1] = 0xea defaultBytes[2] = 0xf1 defaultBytes[3] = 0xfc defaultBytes[4] = 0x43