检查字符串是否有效,以 Java 编码的 UTF-8

2022-09-01 00:10:47

如何检查字符串是否采用有效的 UTF-8 格式?


答案 1

只能检查字节数据。如果你构造了一个字符串,那么它在内部已经是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 是一个库,可帮助您检测它。


答案 2

以下帖子摘自官方 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

推荐