tgoop.com/nlinker_rust/1855
Last Update:
Когда-то наши потомки будут рыдать горючими слезами от того, что наворотили в Юникоде. Самая главная статья, которую надо прочесть, это
https://manishearth.github.io/blog/2017/01/14/stop-ascribing-meaning-to-unicode-code-points/
Есть несколько уровней в юникоде.
* На нижнем — кодировка. Преобразует байты в code points. UTF-8 — одна из таких кодировок. Например, code point U+008D
она запишет как два байта (октета). Code point U+007A
она запишет как один байт 7A — специально так проектировалась, чтобы для первых 127 code point'ов выдавать байты, совпадающие с ASCII. Некоторые code point'ы могут записываться в UTF-8 шестью байтами. Есть и другие кодировки: UTF-16BE, UTF-16LE (ещё иногда бывает byte order mark), UTF-32. Например, в UTF-16 все code point занимают чётное количество байт — два или четыре (это ещё называют "суррогатными парами" из двух code unit, по два байта каждый).
Вывод: по байту, не зная кодировки, нельзя понять, что это.
* Конкретно в UTF-8 байты со значением не между 0-127 нельзя понять, частью какого code point он является.
* Дальше каждый code point — это на самом деле страшная вещь. Их можно комбинировать вместе и получать символы. Например, есть минимум два способа записать кириллическую букву "ё" — одним code point или двумя ("е" + "две точки"). В других языках сложнее (смотри ссылку выше).
* Дальше можно объединять code point в графемные кластеры. Это творческий процесс: например, в корейском в кластер соберутся несколько букв, которые образуют один-два слога. Просто они записываются примерно как один квадратик. В арабской вязи всё ещё веселее.
Не существует никакой концепции "символа", которая бы переносилась между языками. Даже в европейских языках бывают сюрпризы: одна "заглавная" буква "ß" в нижнем регистре превращается в две — "ss".
Поэтому нельзя говорить про "символы" в отрыве от конечной задачи преобразования текста, которую мы решаем.
Даже конкатенировать так просто нельзя, привет от LTR-RTL marks.
Ссылки по теме:
https://manishearth.github.io/blog/2017/01/14/stop-ascribing-meaning-to-unicode-code-points/
https://manishearth.github.io/blog/2017/01/15/breaking-our-latin-1-assumptions/
https://hsivonen.fi/string-length/
BY Linker Unsafe

Share with your friend now:
tgoop.com/nlinker_rust/1855