Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Семён Факторович (HDsoft) рассказывает про Unicode и историю кодировок.

«Что лучше: UTF-8, UTF-16 или UTF-32? Сколькими байтами кодируется одна буква в UTF-16? Почему использование слова «буква» в предыдущем вопросе некорректно? Почему правильно реализовать strlen() или функцию переворачивания строки вовсе не так просто, как кажется? И почему, чёрт возьми, при попытке вывести русские буквы в консоль я вижу кракозябры?

В лекции будут даны ответы на эти и некоторые другие вопросы о Unicode. Бонусом мы расскажем краткую историю кодировок от начала времен (точнее, от времен DOS CP 866 и KOI8-R)»

Видеозапись: http://www.youtube.com/watch?v=8HRq_-c5fn0

Подробности: http://techtalks.nsu.ru

Tech Talks @NSU

October 28, 2014
Tweet

More Decks by Tech Talks @NSU

Other Decks in Education

Transcript

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

    性交 Семён Факторович vk.com/sfactor lazeez
  2. ASCII Σε γνωρίζω από την κόψη του σπαθιού την τρομερή,

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

    - Cyrillic • 1252 - Latin • 1253 - Greek • 1255 - Hebrew • ...
  4. • Windows 1251 • DOS (OEM 866) • KOI-8 •

    MacCyrillic Русскому языку не повезло
  5. Win 1251 KOI-8 В о п р о с 194

    238 239 240 238 241 б Н О П Н Я
  6. (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
  7. Unicode • Единый стандарт • 1 буква = 2 байта

    • 65536 символов должно хватить всем
  8. ... ... ... 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 ... ... ...
  9. Unicode: the basics • Элемент таблицы — code point •

    Code (U+0061) • Name (Latin Small Letter A)
  10. é 1 abstract character, 2 code points U+0065 Latin Small

    Letter E U+02CA Modifier Letter Acute Accent
  11. Unicode: the caveats • 65536 code points недостаточно • Одних

    иероглифов только 74500! • Сейчас стандарт описывает 109449 code points
  12. UTF-8 1 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 bytes 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  13. UTF-8 • strlen(“Hello world”) == 11 • strlen(“Привет”) == 12

    • Линейная индексация • Простая синхронизация
  14. Endianness problem • Byte order mark, BOM • Ставится в

    начале строки • U+FEFF, Zero-width non-breaking space • Читаем 0xFEFF или 0xFFFE и определяем endianness
  15. Endianness problem • Byte order mark, BOM • При отсутствии

    BOM считаем, что строка big-endian • Большинство софта по умолчанию ожидает little-endian
  16. Endianness problem • В UTF-8 и UTF-32 порядок байт всегда

    однозначный • Но Microsoft использует BOM для UTF-8
  17. Endianness problem • В UTF-8 и UTF-32 порядок байт всегда

    однозначный • Но Microsoft использует BOM для UTF-8
  18. Работа с текстом • Чтение текста (из файла, из сокета,

    из БД...) • Внутреннее хранение и обработка • Вывод текста (в файл, на экран, в сокет, в API-вызов)
  19. Работа с текстом 1. Определитесь с внутренним представлением текста (UTF-8,

    UTF-16, UTF-32) 2. Убедитесь, что вы правильно работаете с выбранной кодировкой 3. При чтении текста конвертируйте его во внутреннее представление 4. При выводе текста конвертируйте его в нужную кодировку
  20. Работа с текстом 2. Убедитесь, что вы правильно работаете с

    выбранной кодировкой Длина строки? Индексация? Регулярные выражения?
  21. résumé [ r e ˊ s u m e ˊ]

    strlen(“résumé”): 6 или 8 “résumé”[1]: e или é reverse(“résumé”): émusér или ˊemuśer
  22. Внутреннее представление строк • What matters is internal representation •

    Почитайте мануал по работе со строками в вашем языке • Помните о кодировке при получении и выводе текста
  23. Работа со строками • Длина строки? • Количество байт •

    Количество символов • Отображение на экране • Перемещение курсора
  24. Лигатуры ffl • 1 code point (U+FB04) • 3 буквы

    (F, F, L) • 1 позиция курсора • Backspace не стирает символ, а превращает его в “FF”
  25. é U+0065 Latin Small Letter E U+02CA Modifier Letter Acute

    Accent или U+00E9 Latin Small Letter E with Acute?
  26. Unicode normalization • Композиция: комбинированные символы собираются в один •

    Декомпозиция: сложные символы разбираются на комбинации
  27. Unicode normalization • Понятие эквивалентности символов • Ничего придумывать не

    нужно: все описано в стандарте Unicode • Реализовывать тоже ничего не нужно: http://icu-project.org/
  28. Что еще бывает • Collations: • Ç C ç c:

    кто старше? • Case mapping • Турецкий язык: i => İ • RTL, BiDi
  29. Подытожим • UTF-8 FTW (utf8everywhere.org) • Помните о внутреннем представлении

    • Помните о кодировках при вводе/выводе информации • Не пишите ничего сами: ICU project
  30. Всё, что вы хотели знать о Unicode, но боялись спросить

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