Что такое суррогатные персонажи в UTF-8? - PullRequest
0 голосов
/ 23 июня 2018

У меня есть странная программа проверки, которая проверяет, является ли строка utf-8 допустимым именем хоста (Zend Framework Hostname valdiator в PHP).Это позволяет IDN (интернационализированные доменные имена).Он будет сравнивать каждый поддомен с наборами символов, определяемыми их представлением в HEX-байтах.Два таких набора D800-DB7F и DC00-DFFF.Функция сравнения php regexp под названием preg_match не выполняется во время этих сравнений, и она говорит, что символы DC00-DFFF не разрешены в этой функции.Из википедии я узнал, что эти байты называются суррогатными символами в UTF-8.Что такое тэй и каким персонажам они на самом деле соответствуют?Я читаю в нескольких местах, я до сих пор не понимаю, что они.

1 Ответ

0 голосов
/ 27 июня 2018

Что такое суррогатные символы в UTF-8?

Это почти как вопрос с подвохом.

Приблизительный ответ # 1: 4 байта (если они спарены и закодированы в UTF-8).

Приблизительный ответ № 2: Неверно (если не спарено).

Примерный ответ № 3: Это не UTF-8;Это Модифицированный UTF-8 .

Краткое содержание: этот термин не относится к UTF-8.

У кодовых точек Unicode есть диапазон, который требует 21 бит данных.

Единицы кода UTF-16 - 16 бит.UTF-16 кодирует некоторые диапазоны кодовых точек Unicode как одну кодовую единицу, а другие - как пары двух кодовых единиц, первая из «высокого» диапазона, вторая из «низкого» диапазона.Юникод резервирует недопустимые кодовые точки, которые соответствуют диапазонам пар высокого и низкого уровня.Их иногда называют суррогатами, но они не персонажи.Они ничего не значат сами по себе.

Единицы кода UTF-8 - 8 бит.UTF-8 кодирует несколько различных диапазонов кодовых точек в одной-четырех кодовых единицах соответственно.

# 1 Случается, что кодовые точки, которые UTF-16 кодирует двумя 16-битными кодовыми единицами, UTF-8 кодируют 4 8-битными кодовыми единицами, и наоборот.

# 2Вы можете применить алгоритм кодирования UTF-8 к недопустимым кодовым точкам, что недопустимо.Они не могут быть декодированы до правильной кодовой точки.Совместимый читатель выдает исключение или выбрасывает байты и вставляет символ замены (�).

# 3 Java обеспечивает способ реализации функций во внешнем коде с помощью системы, называемой JNI.Java String API обеспечивает доступ к String и char в виде единиц кода UTF-16.В некоторых местах в JNI, предположительно для удобства, строковые значения модифицированы UTF-8 .Модифицированный UTF-8 - это алгоритм кодирования UTF-8, применяемый к кодовым единицам UTF-16 вместо кодовых точек Unicode.

Несмотря на это, основное правило кодировки символов заключается в чтении с кодировкой, которая использовалась для записи.Если любая последовательность байтов должна рассматриваться как текст, вы должны знать кодировку;В противном случае вы потеряете данные.

...