Является ли ED A0 80 ED B0 80 действительной последовательностью байтов UTF-8? - PullRequest
10 голосов
/ 13 января 2012

java.nio.charset.Charset.forName ("utf8"). Decode декодирует последовательность байтов

 ED A0 80 ED B0 80

в кодовую точку Unicode:

 U+10000

java.nio.charset.Charset.forName ("utf8"). Decode также декодирует последовательность байтов

 F0 90 80 80

в кодовую точку Unicode:

 U+10000

Это подтверждается кодом ниже .

Теперь, похоже, это говорит мне о том, что схема кодирования UTF-8 будет декодировать ED A0 80 ED B0 80 и F0 90 80 80 в одну и ту жекодовая точка Unicode.

Однако, если я захожу на https://www.google.com/search?query=%ED%A0%80%ED%B0%80,

, я вижу, что он явно отличается от страницы https://www.google.com/search?query=%F0%90%80%80

, поскольку поиск Google использует UTF-8 схема кодирования (поправьте меня, если я ошибаюсь),

Это говорит о том, что UTF-8 не декодирует ED A0 80 ED B0 80 и F0 90 80 80 в одну и ту же кодовую точку (ы) Unicode.

Так что в принципе мне было интересно, по официальному стандарту , должен ли UTF-8 декодировать ED A0 80 ED B0 80 последовательность байтов в кодовую точку Unicode U + 10000?

Код :

public class Test {

    public static void main(String args[]) {
        java.nio.ByteBuffer bb = java.nio.ByteBuffer.wrap(new byte[] { (byte) 0xED, (byte) 0xA0, (byte) 0x80, (byte) 0xED, (byte) 0xB0, (byte) 0x80 });
        java.nio.CharBuffer cb = java.nio.charset.Charset.forName("utf8").decode(bb);
        for (int x = 0, xx = cb.limit(); x < xx; ++x) {
            System.out.println(Integer.toHexString(cb.get(x)));
        }
        System.out.println();
        bb = java.nio.ByteBuffer.wrap(new byte[] { (byte) 0xF0, (byte) 0x90, (byte) 0x80, (byte) 0x80 });
        cb = java.nio.charset.Charset.forName("utf8").decode(bb);
        for (int x = 0, xx = cb.limit(); x < xx; ++x) {
            System.out.println(Integer.toHexString(cb.get(x)));
        }
    }
}

Ответы [ 3 ]

11 голосов
/ 13 января 2012

ED A0 80 ED B0 80 - кодировка UTF-8 суррогатной пары UTF-16 D800 DC00. Это НЕ разрешено в UTF-8 :

Однако пары значений UCS-2 между D800 и DFFF (суррогатные пары на языке Юникод) ... требуется специальное обращение: UTF-16 преобразование должно быть отменено , получая символ UCS-4, который затем преобразуется, как указано выше.

Однако такая кодировка - это , используемая в CESU-8 и Java "Modified UTF-8".

Поскольку в Поиске Google используется схема кодирования UTF-8 (исправьте меня, если я ошибаюсь),

Судя по окну поиска, кажется, что Google использует какое-то автоопределение кодировки. Если вы передаете его F0 90 80 80, который является действительным UTF-8, он интерпретируется как UTF-8 (?). Если вы передаете его ED A0 80 ED B0 80, который является недействительным UTF-8, он интерпретирует его как windows-1252 (í�€í°€).

1 голос
/ 13 января 2012

Java UTF8 действительно вариант CESU-8 . В первом случае используются суррогатные пары, закодированные в «стиле» UTF8.

0 голосов
/ 13 января 2012
F0 90 80 80

декодируется как U+10000 или LINEAR B SYLLABLE B008 A.

ED A0 80 ED B0 80

декодируется как U+d800 U+dc00.

...