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

检查字符串是否为用Java编码的有效UTF-8,java,encoding,utf-8,Java,Encoding,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-

如何检查字符串是否为有效的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]);
}
String myString=“\u0048\u0065\u006C\u006C\u006F World”;
System.out.println(myString);
byte[]myBytes=null;
尝试
{
myBytes=myString.getBytes(“UTF-8”);
} 
捕获(不支持的编码异常e)
{
e、 printStackTrace();
系统退出(-1);
}
对于(int i=0;i

如果您不知道字节数组的编码,可以使用一个库来帮助您检测它。

以下文章摘自官方Java教程,网址为:

StringConverter程序首先创建一个包含 Unicode字符:

String original = new String("A" + "\u00ea" + "\u00f1" + "\u00fc" + "C");
打印时,名为original的字符串显示为:

AêñüC
要将String对象转换为UTF-8,请调用getBytes方法并 指定适当的编码标识符作为参数。这个 getBytes方法返回UTF-8格式的字节数组。创建 从非Unicode字节数组中调用字符串 具有编码参数的构造函数。生成这些的代码 如果指定的编码是 不受支持的:

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程序以UTF8字节和 defaultBytes数组来演示一个重要的点:数组的长度 转换的文本可能与源的长度不同 文本。一些Unicode字符转换为单个字节,另一些转换为 字节对或三元组。 printBytes方法通过调用源文件中定义的byteToHex方法来显示字节数组, unicode deformatter.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]));
    }
}

你的意思是字节[]被有效编码了?最简单的方法可能是对其进行解码并再次编码。检查你是否得到同样的东西。这几乎在所有情况下都是正确的。@Peter这并不总是有效的,因为有些字符可以用不同的字节序列编码。这两个字节序列都是正确的,编码的字符相同,但字节不同。@Jesper,如果数据是用Java编码的,它将是相同的。这取决于OP真正想要测试什么。顺便说一句,在Java中,
\0
字符编码为两个字节作为澄清,严格来说,字符串的实例不是UTF-16编码形式,因为它允许格式错误的代码单元序列(以孤立的代理代码单元的形式)。但是,它是Unicode 16位字符串。更严格地说,Java字符串也不是真正的Unicode 16位字符串,因为它可以包含UCS4(3字节和4字节)字符。ICU4J是另一个可以帮助您检测字节数组编码的Java库:Java字符串使用基于UTF-16的接口。它在“字符串表示UTF-16格式的字符串”中这样说。代理是UTF-16的一部分,而不是UCS-2(UTF-16的前身)。是的,Java字符串是16位Unicode字符串,它们只是使用UTF-16而不是UCS-2作为16位编码。UTF-16不是每字符16位的Unicode字符串表示。UTF-16是unicode字符串的可变字节表示形式。。。就像UTF-8是unicode字符串的可变字节表示形式一样。另一方面,UCS2是字符串的固定2字节表示形式,但并不涵盖所有unicode代码点。
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