UTF-8 против UTF-16 и UTF-32 конверсия путаница - PullRequest
2 голосов
/ 28 сентября 2019

Я немного растерялся из-за преобразования символов Юникода в шестнадцатеричные значения.

Я использую этот веб-сайт для получения шестнадцатеричного значения для символов.(https://www.branah.com/unicode-converter)

Если я поставлю «А» и преобразую, то получу что-то вроде:

0041 --> UTF-16
00000041 --> UTF-32
41 --> UTF-8
00065 --> Decimal Value

Этот вывод выше имеет смысл, потому что мы можем преобразовать все эти шестнадцатеричные значения в 65.

Теперь, если я поставлю «Я» (без кавычек) и преобразую его, я получу такие значения, как.

042f --> UTF-16
0000042f --> UTF-32
d0af --> UTF-8
01071 --> Decimal Value

Этот вывод не имеет смысла для меня, потому что не все эти шестнадцатеричные значенияпреобразовать обратно в 1071.

Если вы возьмете d0af и попытаетесь преобразовать его обратно в десятичное значение, тогда вы получите 53423 .

Thisэто то, что действительно сбивает меня с толку, и я ищу в Интернете, чтобы найти ответы об этой конверсии, но до сих пор я не смог найти хорошего ответа.

Итак, мне интересно, есть ли здесь кто-нибудьможет помочь. (это означало бы много) // Заранее спасибо.

Вы также можете увидеть ссылку ниже для примера этого преобразования в двоичном формате. (и вы можете объяснить, почему utf-8двоичное значение отличается в последнем примере ??)

http://kunststube.net/encoding/

1 Ответ

2 голосов
/ 28 сентября 2019

UTF-8 использует кодирование переменной длины (можно использовать 1, 2, 3 или 4 байта для хранения одного символа).

enter image description here

Inв этом случае:

d0af = 11010000 10101111

110 в начале говорит нам ожидать 2 байта при его декодировании (глядя на столбец байта 1 схемы).При декодировании мы используем двоичные цифры, которые следуют за первыми 0 в байте.Итак, 110x xxxx x являются нашей первой партией значений для нашего фактического значения Unicode.Каждый дополнительный байт следует шаблону 10xx xxxx.Таким образом, взяв значения из байтов 1 и 2, мы получим:

110[10000] 10[101111] = 
      V        V
     10000 101111 = 42f = 1071

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

Если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...