Является ли ED A0 80 ED B0 80 действительной последовательностью байтов UTF-8?
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
в один и тот же код юникода.
Однако, если я нахожусь https://www.google.com/search?query= % ED% A0% 80% ED% В0% 80,
Я вижу, что он явно отличается от страницы https://www.google.com/search?query= % F0% 90% 80% 80
Поскольку Google Search использует схему кодирования UTF-8 (исправьте меня, если я ошибаюсь),
Это говорит о том, что UTF-8 не декодирует ED A0 80 ED B0 80
и F0 90 80 80
в один и тот же код юникода.
Итак, в основном мне было интересно, по официальному стандарту, 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)));
}
}
}
Ответы
Ответ 1
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 "Модифицированный UTF-8".
Поскольку Google Search использует схему кодирования UTF-8 (исправьте меня, если я ошибаюсь),
На основе окна поиска отображается, что Google использует какое-то автоматическое определение кодировки. Если вы передадите его F0 90 80 80
, который действителен UTF-8, он интерпретирует его как UTF-8 (𐀀
). Если вы передадите его ED A0 80 ED B0 80
, что является недопустимым UTF-8, оно интерпретирует его как windows-1252 (í�€í°€
).
Ответ 2
Java UTF8 действительно является CESU-8. В первом случае используются суррогатные пары, закодированные в стиле UTF8.
Ответ 3
F0 90 80 80
декодируется как U+10000
или LINEAR B SYLLABLE B008 A
.
ED A0 80 ED B0 80
декодирует как U+d800 U+dc00
.