Это вообще строка из четырёх символов или число в зависимости от того, как прочитать.
Ну как так, раз это символ 'z'
Неверно, это число 122
Я сейчас не троллю и не стебусь, если что. Есть несколько уровней в юникоде. * На нижнем — кодировка. Преобразует байты в 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.
Обсуждают сегодня