Ничего себе.С одной стороны, я очень рад узнать, что университетские курсы учат реальности того, что кодирование символов - это тяжелая работа, но на самом деле знание правил кодирования UTF-8 звучит как ожидание многого.(Поможет ли это студентам пройти тест по Турции ?)
Самое ясное описание правил кодирования кодовых точек UCS в UTF-8, которое я видел, взято из справочной страницы utf-8(7)
во многих системах Linux:
Encoding
The following byte sequences are used to represent a
character. The sequence to be used depends on the UCS code
number of the character:
0x00000000 - 0x0000007F:
0xxxxxxx
0x00000080 - 0x000007FF:
110xxxxx 10xxxxxx
0x00000800 - 0x0000FFFF:
1110xxxx 10xxxxxx 10xxxxxx
0x00010000 - 0x001FFFFF:
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
[... removed obsolete five and six byte forms ...]
The xxx bit positions are filled with the bits of the
character code number in binary representation. Only the
shortest possible multibyte sequence which can represent the
code number of the character can be used.
The UCS code values 0xd800–0xdfff (UTF-16 surrogates) as well
as 0xfffe and 0xffff (UCS noncharacters) should not appear in
conforming UTF-8 streams.
Может быть проще запомнить «сжатую» версию диаграммы:
Начальные байты начинаются с искаженных кодовых точек, начинающихся с 1
, и добавляютсянабивка 1+0
.Последующие байты начинаются 10
.
0x80 5 bits, one byte
0x800 4 bits, two bytes
0x10000 3 bits, three bytes
Вы можете получить диапазоны, отметив, сколько пробелов можно заполнить битами, разрешенными в новом представлении:
2**(5+1*6) == 2048 == 0x800
2**(4+2*6) == 65536 == 0x10000
2**(3+3*6) == 2097152 == 0x200000
Я знаю, Я мог помнить правила, чтобы вывести диаграмму легче, чем сам график.Надеюсь, вы тоже хорошо помните правила.:)
Обновление
Как только вы построите диаграмму выше, вы можете преобразовать входные кодовые точки Unicode в UTF-8, найдя их диапазон, преобразовав из шестнадцатеричного в двоичное,вставка битов в соответствии с приведенными выше правилами, а затем преобразование обратно в шестнадцатеричное значение:
U+4E3E
Это соответствует диапазону 0x00000800 - 0x0000FFFF
(0x4E3E < 0xFFFF
), поэтому представление будет иметь вид:
1110xxxx 10xxxxxx 10xxxxxx
0x4E3E
- это 100111000111110b
.Бросьте биты в x
выше (начните справа, мы заполним пропущенные биты в начале с 0
):
1110x100 10111000 10111110
Осталось место x
вначало, заполните его 0
:
11100100 10111000 10111110
Преобразовать из битов в шестнадцатеричные :
0xE4 0xB8 0xBE