Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何验证UTF-8字符串是否包含错误编码的字符_Java_Utf 8_Character Encoding - Fatal编程技术网

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-
。到目前为止,这可能是我找到的最简单的解决方案。谢谢!