73
Всё, что вы хотели знать о Unicode, но боялись спросить 性交 Семён Факторович vk.com/sfactor lazeez

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

Embed Size (px)

Citation preview

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

Всё, что вы хотели знать о Unicode,но боялись спросить

性交

Семён Факторовичvk.com/sfactor

lazeez

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

Кто здесь?

• Семён Факторович• АФТИ ФФ (2007), магистратура ФИТ (2009)

• НГУ, HDsoft

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

ASCII

ANSIOEM

KOI-8

Win-1251

UTF-8

Unicode

UTF-16 UTF-32

UCS-2

DOS 866

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

ASCII

American Standard Code for Information Interchange

1 символ = 1 байт

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

ASCII

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

ASCII

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

ASCII

Σε γνωρίζω από την κόψητου σπαθιού την τρομερή,

Cъешь ещё этих мягких французских булок, да выпей же чаю

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

ASCII

Non-latin characters находятся в верхней части таблицы (128-255)

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

ASCII

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

Codepages

• Windows Codepages, ANSI codepages

• ...

• 1251 - Cyrillic

• 1252 - Latin

• 1253 - Greek

• 1255 - Hebrew

• ...

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

Русскому языку не повезло

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

• Windows 1251

• DOS (OEM 866)

• KOI-8

• MacCyrillic

Русскому языку не повезло

Page 13: Tech Talks @NSU: Всё, что вы хотели знать про Unicode, но боялись спросить
Page 14: Tech Talks @NSU: Всё, что вы хотели знать про Unicode, но боялись спросить
Page 15: Tech Talks @NSU: Всё, что вы хотели знать про Unicode, но боялись спросить
Page 16: Tech Talks @NSU: Всё, что вы хотели знать про Unicode, но боялись спросить
Page 17: Tech Talks @NSU: Всё, что вы хотели знать про Unicode, но боялись спросить

Win 1251

KOI-8

В о п р о с

194 238 239 240 238 241

б Н О П Н Я

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

(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

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

ASCII-based encodings

• 1 буква = 1 байт

• Константная индексация• 100% error tolerance

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

ASCII-based encodings

Главное — выбрать кодировку

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

ASCII: две проблемы

• Невозможность использовать несколько non-latin алфавитов в одном тексте

• Иероглифическое письмо

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

Unicode

• Единый стандарт• 1 буква = 2 байта

• 65536 символов должно хватить всем

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

Unicode: the basics

Давайте сведем все (абсолютно все!) символы в одну таблицу

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

.........

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

.........

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

Unicode: the basics

• Элемент таблицы — code point

• Code (U+0061)

• Name (Latin Small Letter A)

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

Unicode: the basics

• codepoint ≠ символ

• “abstract character”

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

Х1 abstract character, 1 code point

U+0425 Cyrillic Capital Letter Ha

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

é1 abstract character, 2 code points

U+0065 Latin Small Letter E

U+02CA Modifier Letter Acute Accent

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

é1 abstract character, 1 code point

U+00E9 Latin Small Letter E with Acute

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

œ2 буквы!

1 abstract character, 1 code point

U+0151 Latin Small Ligature OE

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

Unicode: the ultimate solution?

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

Unicode: the caveats

• Latin Capital letter H, U+0048

• strlen(“Hello world”) == 0

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

Unicode: the caveats

• 65536 code points недостаточно

• Одних иероглифов только 74500!

• Сейчас стандарт описывает 109449 code points

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

UTF-8

Variable-length encoding спешит на помощь!

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

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

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

UTF-8

• 1-6 байт

• ASCII compatible: английский текст в ASCII идентичен UTF-8

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

UTF-8

• strlen(“Hello world”) == 11

• strlen(“Привет”) == 12

• Линейная индексация• Простая синхронизация

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

UTF-16

• Внезапно, тоже variable-length

• 2 или 4 байта

• Surrogate pairs

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

UCS-2

• “The original Unicode”

• Всегда 2 байта

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

UTF-32

• Всегда 4 байта

• Ура, константная индексация!

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

Endianness problem

• UTF-16: 2 или 4 байта

• UTF-16LE, UTF-16BE

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

Endianness problem

• Byte order mark, BOM

• Ставится в начале строки

• U+FEFF, Zero-width non-breaking space

• Читаем 0xFEFF или 0xFFFE и определяем endianness

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

Endianness problem

• Byte order mark, BOM

• При отсутствии BOM считаем, что строка big-endian

• Большинство софта по умолчанию ожидает little-endian

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

Endianness problem

• А можно просто искать вхождения 0x0020 или 0x2000

• U+0020 Space character

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

Endianness problem

• В UTF-8 и UTF-32 порядок байт всегда однозначный

• Но Microsoft использует BOM для UTF-8

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

Endianness problem

• В UTF-8 и UTF-32 порядок байт всегда однозначный

• Но Microsoft использует BOM для UTF-8

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

Зоопарк

• ASCII

• UTF-8

• UTF-16

• UCS-2

• UTF-32

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

Windows

• Смесь ASCII и UTF-16

• SetWindowTextA() и SetWindowTextW()

• #define UNICODE

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

Linux, OS X

• UTF-8

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

Работа с текстом

• Чтение текста (из файла, из сокета, из БД...)

• Внутреннее хранение и обработка

• Вывод текста (в файл, на экран, в сокет, в API-вызов)

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

Работа с текстом

1. Определитесь с внутренним представлением текста (UTF-8, UTF-16, UTF-32)

2. Убедитесь, что вы правильно работаете с выбранной кодировкой

3. При чтении текста конвертируйте его во внутреннее представление

4. При выводе текста конвертируйте его в нужную кодировку

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

Работа с текстом

2. Убедитесь, что вы правильно работаете с выбранной кодировкой

Длина строки?

Индексация?

Регулярные выражения?

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

résumé [ r e ˊ s u m e ˊ]

strlen(“résumé”): 6 или 8

“résumé”[1]: e или é

reverse(“résumé”): émusér или ˊemuśer

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

Внутреннее представление строк

• What matters is internal representation

• Почитайте мануал по работе со строками в вашем языке

• Помните о кодировке при получении и выводе текста

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

Работа со строками

• Длина строки?

• Количество байт• Количество символов• Отображение на экране• Перемещение курсора

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

Лигатуры

ffl• 1 code point (U+FB04)

• 3 буквы (F, F, L)

• 1 позиция курсора

• Backspace не стирает символ, а превращает его в “FF”

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

Dynamic composition

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

Привет́

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

éU+0065 Latin Small Letter E

U+02CA Modifier Letter Acute Accent

или

U+00E9 Latin Small Letter E with Acute?

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

Unicode normalization

• Композиция: комбинированные символы собираются в один

• Декомпозиция: сложные символы разбираются на комбинации

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

Unicode normalization

• Понятие эквивалентности символов• Ничего придумывать не нужно: все описано в стандарте Unicode

• Реализовывать тоже ничего не нужно: http://icu-project.org/

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

Unicode normalization

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

Unicode normalization

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

Что еще бывает

• Collations:

• Ç C ç c: кто старше?

• Case mapping

• Турецкий язык: i => İ

• RTL, BiDi

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

Что еще бывает

• Все уже реализовано за нас:• http://icu-project.org/

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

Подытожим

• UTF-8 FTW (utf8everywhere.org)

• Помните о внутреннем представлении

• Помните о кодировках при вводе/выводе информации

• Не пишите ничего сами: ICU project

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

Всё, что вы хотели знать о Unicode,но боялись спросить

性交

Семён Факторовичvk.com/sfactor

lazeez