Java 如何验证UTF-8字符串是否包含错误编码的字符
在大型数据集中,我有一些数据如下所示:Java 如何验证UTF-8字符串是否包含错误编码的字符,java,utf-8,character-encoding,Java,Utf 8,Character Encoding,在大型数据集中,我有一些数据如下所示: "guide (but, yeah, it’s okay to share it with ‘em)." 我已经在一个十六进制编辑器中打开了这个文件,并通过一个字符编码检测算法()运行原始字节数据,它被肯定地检测为UTF-8 在我看来,数据源错误地解释了原始字符集,并将有效的UTF-8写入了我收到的输出 我想尽我所能验证数据。有没有什么启发法/算法可以帮助我尝试验证?一旦有了字符串,就不能这么做,必须在仍然有原始输入的情况下这样做。一旦有了字符串
"guide (but, yeah, it’s okay to share it with ‘em)."
我已经在一个十六进制编辑器中打开了这个文件,并通过一个字符编码检测算法()运行原始字节数据,它被肯定地检测为UTF-8
在我看来,数据源错误地解释了原始字符集,并将有效的UTF-8写入了我收到的输出
我想尽我所能验证数据。有没有什么启发法/算法可以帮助我尝试验证?一旦有了字符串,就不能这么做,必须在仍然有原始输入的情况下这样做。一旦有了字符串,就无法自动判断
是否™代码>实际上是有意输入的,没有进行一些非常脆弱的测试。例如:
public static boolean isUTF8MisInterpreted( String input ) {
//convenience overload for the most common UTF-8 misinterpretation
//which is also the case in your question
return isUTF8MisInterpreted( input, "Windows-1252");
}
public static boolean isUTF8MisInterpreted( String input, String encoding) {
CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
CharsetEncoder encoder = Charset.forName(encoding).newEncoder();
ByteBuffer tmp;
try {
tmp = encoder.encode(CharBuffer.wrap(input));
}
catch(CharacterCodingException e) {
return false;
}
try {
decoder.decode(tmp);
return true;
}
catch(CharacterCodingException e){
return false;
}
}
public static void main(String args[]) {
String test = "guide (but, yeah, it’s okay to share it with ‘em).";
String test2 = "guide (but, yeah, it’s okay to share it with ‘em).";
System.out.println( isUTF8MisInterpreted(test)); //true
System.out.println( isUTF8MisInterpreted(test2)); //false
}
如果您仍然可以访问原始输入,您可以通过以下命令查看字节数组是否等于完全有效的utf-8字节序列:
public static boolean isValidUTF8( byte[] input ) {
CharsetDecoder cs = Charset.forName("UTF-8").newDecoder();
try {
cs.decode(ByteBuffer.wrap(input));
return true;
}
catch(CharacterCodingException e){
return false;
}
}
您也可以将CharsetDecoder与streams一起使用,默认情况下,它在看到给定编码中的无效字节时会立即引发异常。如果您使用的是HTML5,则只需添加
内的
对于HTML4,这里的源代码是什么?您是否将原始数据推送到上述来源?乍一看,我想说您尝试过并将cp-1252撇号推到它上面,而没有将它们转换为适当的UTF-8等价物……您需要展示如何从数据集中读取特定数据,以及如何向最终用户/您自己呈现特定数据。例如,您是否使用FileReader
读取它并使用System.out.println()
显示它?您必须告诉其中一个或两个用户使用UTF-8而不是平台默认字符集(可识别为CP1252)。这看起来像是一个UTF-8数据源(U+2019”
正确编码为八位字节e2 80 99
),使用单字节windows-1252编码解码(其中它们被解释为代码点U+00e2 U+20ac U+2122-™代码>。到目前为止,这可能是我找到的最简单的解决方案。谢谢!