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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

Всё, что вы хотели знать про 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

Avatar for Tech Talks @NSU

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