检查String是否在Java中是有效的UTF-8编码

时间:2011-07-08 09:03:15

标签: java encoding utf-8

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

2 个答案:

答案 0 :(得分:33)

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

答案 1 :(得分:1)

以下帖子摘自官方Java教程:https://docs.oracle.com/javase/tutorial/i18n/text/string.html

  

StringConverter程序首先创建一个包含的String   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