Как 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 не является самосинхронизирующимся, если один байт потерян или если обход начинается со случайного байта).