Почему одна и та же последовательность байтов приводит к различным номерам символов в UTF-8 и UTF-16? - PullRequest
0 голосов
/ 12 апреля 2020

Я декодирую последовательность байтов [72, 101, 108, 108, 111, 32, 87, 111, 114, 100, 10] из файла в последовательность символов. При использовании UTF-8 номера символов (т.е. целые числа без знака), представляющие эту последовательность байтов, равны [72 'H', 101 'e', 108 'l', 108 'l', 111 'o', 32 '', 87 'W', 111 'o', 114 'r', 100 'd' , 10 '\n'], но при использовании UTF-16 номера символов равны [25928 '效', 27756 '汬', 8303 '', 28503 '潗', 25714 '摲'].

Я ожидал, что UTF-16 даст те же номера символов, что и UTF-8, так как все номера символов 72, 101, 108, 111, 32, 87, 114 и 10 находятся в диапазоне 2 ^ 16 (т.е. 65536) комбинаций байтов и предполагая, что количество комбинаций совпадает с номерами символов, тогда UTF-16 должен иметь те же номера символов Unicode.

Я подозреваю, что причина как-то связана с тем, как восемь двоичных цифр преобразуются в целое число без знака и что последовательность байтов считывается из файла с использованием кодировки UTF-8, что объясняет, почему номера символов с UTF-8 остаются такими же? Однако я не понимаю, как октеты преобразуются в номера символов [25928, 27756, 8303, 28503, 25714] при использовании UTF-16?

Я пытался проверить с rfc2781 inte rnet консорциум, но шестнадцатеричные в разделе 2.2. превзойти максимальное значение байта, поэтому я не могу экспериментировать с W1 и W2.

Вот пример:

// 11 is the number of bytes in the file
byte[] buffer = new byte[11];

// Code that reads a sequence of bytes from a file containing only the string "Hello Word" to the
// byte array named buffer goes here

Decoder UTF-8decoder = Encoding.UTF8.getDecoder();
Decoder UTF-16decoder = Encoding.Unicode.getDecoder();

char[] charactersWithUTF8 = new char[buffer.length];
char[] charactersWithUTF-16 = new char[buffer.length];

UTF-8decoder.getChars(buffer, 0, buffer.length, charactersWithUTF8, 0);
UTF-16decoder.getChars(buffer, 0, charactersWithUTF-16, 0);

foreach(var character in charactersWithUTF8) {
Console.WriteLine(character);
}

Console.WriteLine();

foreach (var character in charactersWithUTF-16) {
Console.WriteLine(character);
}
...