Подтвердить что ты не робот

Как проверить, содержит ли строка UTF-8 неправильные символы

В большом наборе данных у меня есть некоторые данные, которые выглядят следующим образом:

"guide (but, yeah, it’s okay to share it with ‘em)."

Я открыл файл в шестнадцатеричном редакторе и запускал необработанные байтовые данные с помощью алгоритма обнаружения кодировки символов (http://code.google.com/p/juniversalchardet/), и он положительно обнаруживается как UTF -8.

Мне кажется, что источник данных неправильно интерпретировал исходный набор символов и написал действительный UTF-8 в качестве результата, который я получил.

Я хочу проверить данные, насколько это возможно. Существуют ли какие-либо эвристики/алгоритмы, которые могут помочь мне получить удар по проверке?

4b9b3361

Ответ 1

Вы не можете сделать это, как только у вас есть строка, вы должны сделать это, пока у вас все еще есть исходный ввод. После того, как у вас есть строка, нет возможности автоматически определить, действительно ли был введен ’ ввод без каких-либо серьезных хрупких тестов. Например:

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 с потоками, по умолчанию он выдает исключение, как только он видит недопустимые байты в данной кодировке.

Ответ 2

Если вы используете HTML5, просто добавьте <meta charset="UTF-8"> внутри <head>

для HTML4 <meta http-equiv="Content-type" content="text/html;charset=UTF-8">