Upload
tech-talks-nsu
View
81
Download
1
Embed Size (px)
Citation preview
Всё, что вы хотели знать о Unicode,но боялись спросить
性交
Семён Факторовичvk.com/sfactor
lazeez
Кто здесь?
• Семён Факторович• АФТИ ФФ (2007), магистратура ФИТ (2009)
• НГУ, HDsoft
ASCII
ANSIOEM
KOI-8
Win-1251
UTF-8
Unicode
UTF-16 UTF-32
UCS-2
DOS 866
ASCII
American Standard Code for Information Interchange
1 символ = 1 байт
ASCII
ASCII
ASCII
Σε γνωρίζω από την κόψητου σπαθιού την τρομερή,
Cъешь ещё этих мягких французских булок, да выпей же чаю
ASCII
Non-latin characters находятся в верхней части таблицы (128-255)
ASCII
Codepages
• Windows Codepages, ANSI codepages
• ...
• 1251 - Cyrillic
• 1252 - Latin
• 1253 - Greek
• 1255 - Hebrew
• ...
Русскому языку не повезло
• Windows 1251
• DOS (OEM 866)
• KOI-8
• MacCyrillic
Русскому языку не повезло
Win 1251
KOI-8
В о п р о с
194 238 239 240 238 241
б Н О П Н Я
(KOI-8 character) && 0b01111111 = (transliterated character)
KOI-8
-128
В о п р о с
247 207 208 210 207 211
119 79 80 82 79 83
w O P R O S
ASCII-based encodings
• 1 буква = 1 байт
• Константная индексация• 100% error tolerance
ASCII-based encodings
Главное — выбрать кодировку
ASCII: две проблемы
• Невозможность использовать несколько non-latin алфавитов в одном тексте
• Иероглифическое письмо
Unicode
• Единый стандарт• 1 буква = 2 байта
• 65536 символов должно хватить всем
Unicode: the basics
Давайте сведем все (абсолютно все!) символы в одну таблицу
.........
U+0061 a Latin Small Letter A
U+0062 b Latin Small Letter B
.........
U+00C7 Ç Latin Capital letter C with cedilla
.........
U+0429 Щ Cyrillic Capital Letter Shcha
.........
U+05E9 ש Hebrew Letter Shin
.........
U+2658 ♘ White Chess Knight
.........
Unicode: the basics
• Элемент таблицы — code point
• Code (U+0061)
• Name (Latin Small Letter A)
Unicode: the basics
• codepoint ≠ символ
• “abstract character”
Х1 abstract character, 1 code point
U+0425 Cyrillic Capital Letter Ha
é1 abstract character, 2 code points
U+0065 Latin Small Letter E
U+02CA Modifier Letter Acute Accent
é1 abstract character, 1 code point
U+00E9 Latin Small Letter E with Acute
œ2 буквы!
1 abstract character, 1 code point
U+0151 Latin Small Ligature OE
Unicode: the ultimate solution?
Unicode: the caveats
• Latin Capital letter H, U+0048
• strlen(“Hello world”) == 0
Unicode: the caveats
• 65536 code points недостаточно
• Одних иероглифов только 74500!
• Сейчас стандарт описывает 109449 code points
UTF-8
Variable-length encoding спешит на помощь!
UTF-81 byte 0xxxxxxx
2 bytes 110xxxxx 10xxxxxx
3 bytes 1110xxxx 10xxxxxx 10xxxxxx
4 bytes 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5 bytes 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6 bytes1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8
• 1-6 байт
• ASCII compatible: английский текст в ASCII идентичен UTF-8
UTF-8
• strlen(“Hello world”) == 11
• strlen(“Привет”) == 12
• Линейная индексация• Простая синхронизация
UTF-16
• Внезапно, тоже variable-length
• 2 или 4 байта
• Surrogate pairs
UCS-2
• “The original Unicode”
• Всегда 2 байта
UTF-32
• Всегда 4 байта
• Ура, константная индексация!
Endianness problem
• UTF-16: 2 или 4 байта
• UTF-16LE, UTF-16BE
Endianness problem
• Byte order mark, BOM
• Ставится в начале строки
• U+FEFF, Zero-width non-breaking space
• Читаем 0xFEFF или 0xFFFE и определяем endianness
Endianness problem
• Byte order mark, BOM
• При отсутствии BOM считаем, что строка big-endian
• Большинство софта по умолчанию ожидает little-endian
Endianness problem
• А можно просто искать вхождения 0x0020 или 0x2000
• U+0020 Space character
Endianness problem
• В UTF-8 и UTF-32 порядок байт всегда однозначный
• Но Microsoft использует BOM для UTF-8
Endianness problem
• В UTF-8 и UTF-32 порядок байт всегда однозначный
• Но Microsoft использует BOM для UTF-8
Зоопарк
• ASCII
• UTF-8
• UTF-16
• UCS-2
• UTF-32
Windows
• Смесь ASCII и UTF-16
• SetWindowTextA() и SetWindowTextW()
• #define UNICODE
Linux, OS X
• UTF-8
Работа с текстом
• Чтение текста (из файла, из сокета, из БД...)
• Внутреннее хранение и обработка
• Вывод текста (в файл, на экран, в сокет, в API-вызов)
Работа с текстом
1. Определитесь с внутренним представлением текста (UTF-8, UTF-16, UTF-32)
2. Убедитесь, что вы правильно работаете с выбранной кодировкой
3. При чтении текста конвертируйте его во внутреннее представление
4. При выводе текста конвертируйте его в нужную кодировку
Работа с текстом
2. Убедитесь, что вы правильно работаете с выбранной кодировкой
Длина строки?
Индексация?
Регулярные выражения?
résumé [ r e ˊ s u m e ˊ]
strlen(“résumé”): 6 или 8
“résumé”[1]: e или é
reverse(“résumé”): émusér или ˊemuśer
Внутреннее представление строк
• What matters is internal representation
• Почитайте мануал по работе со строками в вашем языке
• Помните о кодировке при получении и выводе текста
Работа со строками
• Длина строки?
• Количество байт• Количество символов• Отображение на экране• Перемещение курсора
Лигатуры
ffl• 1 code point (U+FB04)
• 3 буквы (F, F, L)
• 1 позиция курсора
• Backspace не стирает символ, а превращает его в “FF”
Dynamic composition
Привет́
x̃
éU+0065 Latin Small Letter E
U+02CA Modifier Letter Acute Accent
или
U+00E9 Latin Small Letter E with Acute?
Unicode normalization
• Композиция: комбинированные символы собираются в один
• Декомпозиция: сложные символы разбираются на комбинации
Unicode normalization
• Понятие эквивалентности символов• Ничего придумывать не нужно: все описано в стандарте Unicode
• Реализовывать тоже ничего не нужно: http://icu-project.org/
Unicode normalization
Unicode normalization
Что еще бывает
• Collations:
• Ç C ç c: кто старше?
• Case mapping
• Турецкий язык: i => İ
• RTL, BiDi
Что еще бывает
• Все уже реализовано за нас:• http://icu-project.org/
Подытожим
• UTF-8 FTW (utf8everywhere.org)
• Помните о внутреннем представлении
• Помните о кодировках при вводе/выводе информации
• Не пишите ничего сами: ICU project
Всё, что вы хотели знать о Unicode,но боялись спросить
性交
Семён Факторовичvk.com/sfactor
lazeez