Как UTF-16 достигает самосинхронизации?

Я знаю, что UTF-16 является самосинхронизирующейся схемой кодирования. Я также прочитал ниже Wiki, но не совсем понял.

Самосинхронизирующийся код

Можете ли вы объяснить мне на примере UTF-16?

1 ответ

Решение

В UTF-16 символы вне BMP представлены с использованием суррогатной пары, в которой первая единица кода находится в диапазоне от 0xD800 до 0xDBFF, а вторая - от 0xDC00 до 0xDFFF. Каждый из CU представляет 10 битов кодовой точки. Символы в BMP оставлены как есть.

Теперь синхронизация проста. Учитывая положение любой произвольной кодовой единицы:

  • Если кодовая единица находится в диапазоне 0xD800—0xDBFF, это первая кодовая единица из двух, просто прочитайте следующую и декодируйте. Вуаля, у нас есть полный характер за пределами BMP
  • Если кодовая единица находится в диапазоне 0xDC00—0xDFFF, это вторая кодовая единица из двух, просто вернитесь на одну единицу, чтобы прочитать первую часть, или перейдите к следующей единице, чтобы пропустить текущий символ.
  • Если он не входит ни в один из этих диапазонов, то это персонаж в BMP. Нам не нужно больше ничего делать

Смысл самосинхронизации состоит в том, чтобы узнать, находимся ли мы в середине чего-то сразу, вместо того, чтобы снова читать с начала проверки. UTF-16 позволяет нам делать это

Поскольку диапазоны для высших суррогатов, низших суррогатов и действительных символов BMP не пересекаются, суррогат не может совпадать с символом BMP или для (частей) двух соседних символов выглядеть как допустимая суррогатная пара. Это значительно упрощает поиск. Это также означает, что UTF-16 самосинхронизируется с 16-битными словами: может ли кодовая единица начинать символ, может быть определено без проверки более ранних кодовых единиц. UTF-8 разделяет эти преимущества, но многие более ранние схемы многобайтового кодирования (такие как Shift JIS и другие азиатские многобайтовые кодировки) не допускали однозначного поиска и могли быть синхронизированы только путем повторного анализа с начала строки (UTF-16 не является самосинхронизирующимся, если один байт потерян или если обход начинается со случайного байта).

https://en.wikipedia.org/wiki/UTF-16

Другие вопросы по тегам