Почему шестнадцатеричное значение C181 не отображается как заглавная буква A в UTF-8? - PullRequest
0 голосов
/ 26 апреля 2019

Двухбайтовый символ UTF-8 предоставляет 11 битов для полезной нагрузки:

110x xxxx 10xx xxxx

Я знаю, что это неэффективно, но почему эта полезная нагрузка не может быть в более низком диапазоне, так что«А» = 65?

65 decimal = 1000001 binary

two-byte template: 110_ ____ 10__ ____
payload:                   1   00 0001
result:            1100 0001 1000 0001

Ответы [ 2 ]

3 голосов
/ 26 апреля 2019

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

Слишком длинное кодирование, подобноеодин, который вы представляете, обрабатывается как недопустимая последовательность байтов.

Аналогично, вам не разрешено кодировать кодовые точки выше U+10FFFF, хотя алгоритм может получить вас до U+7FFFFFFF.Вам разрешено , однако вы можете кодировать кодовые точки, которые не были назначены (то есть, которые еще не имеют значения).

1 голос
/ 26 апреля 2019

Это угроза безопасности.Разрешение программному обеспечению интерпретировать «не-самую короткую форму» UTF-8 предотвращает точные и эффективные проверки строк.«DROP T [41] BLE» не должно совпадать с «DROP T [C181] BLE».Проблема с такой реализацией будет скрыта, если плохой UTF-8 будет преобразован в хороший UTF-16 перед его использованием.

http://www.unicode.org/versions/corrigendum1.html

(Отдельное спасибо lenz за указание на полезноеусловия поиска.)

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