Tech Talks @NSU: Всё, что вы хотели знать про Unicode, но боялись...

Preview:

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

Привет́

é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

Recommended