SlideShare una empresa de Scribd logo
1 de 36
Descargar para leer sin conexión
«Unicode.
 Ликбез»
Ликбе́з (ликвида́ция
 безгра́мотности)
В переносном смысле —
обучение неподготовленной
аудитории базовым понятиям
какой-либо науки, процесса
или явления.
Упрощенец – тот, кто
поверхностно, не вникая в
суть, подходит к решению
сложных задач, вопросов.
Часть 1

 Задачка, в процессе
  решения которой,
   автор пришел к
  пониманию своего
     невежества
найти в слове
Îñţérñåţîöñåļîžåţîöñ
     подстроку
      Nation
http://stackoverflow.com/questions/
7429964/how-to-match-string-with-
diacritic-in-modern-perl/
7440789#7440789
Решение №1
use 5.014;
use utf8;
use Unicode::Normalize;
binmode STDOUT, ':encoding(UTF-8)';
my $str = "Îñţérñåţîöñåļîžåţîöñ";
my $look = "Nation";
say "before: $strn";
$str = NFD($str);
$str =~ s/pM//og; # remove "marks"
say "after: $str";
say "is_match: ", $str =~ /$look/i || 0;
tchrist:
«This is the wrong
 way to do it. You
need to use a UCA
 match at level 1»
Решение №2
use 5.014;
use utf8;
use Unicode::Collate;
my $str = "Îñţérñåţîöñåļîžåţîöñ";
my $look = "Nation";
my $Collator = Unicode::Collate->new(
   normalization => undef, level => 1
);
my @match = $Collator->match($str, $look);
say “matches: ” . join(“, “, @match);
«Code that assumes you
can remove diacritics to get
 at base ASCII letters is evil,
still, broken, brain-damaged,
 wrong, and justification for
       capital punishment»
?
Часть 2


    Ликбез
 Unicode – это не
кодировка или таблица
символов.
   Это стандарт! В
который входит, кроме
таблиц символов и правил
их кодирования, еще
много-много всего
Стандарт Unicode
таблицы символов, несколько механизмов кодирования

формы нормализации текста

правила casemapping, casefolding

гибкие правила collation

правила переносов для слов и разбиения строк

специальные правила для регулярных выражений

тысячи именованых свойств (properties)

численные эквивалентности (U+216B XII)

направление текста

.... много всего другого ....
TLA (ТБС)
UCS

UTF

BMP

BOM

UCA

NFC, NFD

ICU
UCS (ucs-2, ucs-4)
универсальный набор символов
(англ. UCS, universal character set) 
задаёт однозначное соответствие
символов кодам — элементам
кодового пространства,
представляющим неотрицательные
целые числа.
определен в стандарте ISO/IEC
10646 (включен в стандарт Unicode)
UCS, продолжение...
запись Unicode символов вида: U+0075

пример:
u (U+0075 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴜ) + ¨(U+0308
ᴄᴏᴍʙɪɴɪɴɢ ᴅɪᴀᴇʀᴇsɪs) => ü
mac: unicode hex input (l&t), option + code
windows: alt + “+” + code

www.fileformat.info/info/unicode/char/search.htm
 .../search.htm?q=diacritic&preview=entity
Кодовое пространство (codespace) в
Unicode разбито на 17 плоскостей по 2^16
(65536) code points (кодовых точек)
набор всех code points: 0hex to 10FFFFhex

Нулевая плоскость называется
Basic Multilingual Plane (BMP)
в ней расположены символы наиболее
употребительных письменностей. 
Т.е. это все что в диапазоне 0x0 - 0xFFFF (не
все используются, верхняя часть диапазона
зарезервирована)
Unicode transformation format
    UTF-16BE, UTF-16LE
    UTF-32BE, UTF-32LE
    UTF-8, UTF-EBCDIC

BE (big-endian) – от старшего к младшему
LE (little-endian) – от младшего к старшему

если нет BOM (о нем ниже) то стандартом
предписывается  BE (тупоконечный)
BOM
byte order mark

Важен для UTF-16 и UTF-32. (для
определения тупо/остро-
конечности)
Для UTF-8 обычно не нужео, но
есть в стандарте и часто
используется в Windows. UTF-16,32
программы по BOM могут понять
(если захотят), что в файле utf-8.
UTF-16

включает в себя UCS-2, как
подмножество
особенность кодировки, что
символы не из 0-й plane  задаются
составными кодами 16+16=32 бита
или суррогатными парами
UTF-32

 фиксированной ширины, всегда 4 байта,
UTF-32/UCS-4 requires four bytes to encode
any character. 
http://en.wikipedia.org/wiki/UTF-32/UCS-4
UTF-8
Unix/Web кодировка
2/09/1992 К. Томпсон & Р. Пайк
ASCII-совместима, 1–6 байт (4)
BOM – не нужен!
UTF-EBCDIC – редкая экзотика
для мейнфреймов
character
symbol
grapheme
glypth
letter
diacritical mark
ideogram
Композиция символов –
cимволы задающиеся несколькими кодами.
Для некоторых символов есть как
композитные так и монолитные формы записи
Ё (U+0401) и Й (U+0419), 
Е +  ̈ (U+0415 U+0308)
И +  ̆ (U+0418 U+0306)

Character General Category –
каждый code point относится к одной из
основных категорий.
Буква, знак (см диакр. знаки), число(number),
пунктуационный знак, символ, разделитель
(см. http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf)
Нормализация –
Поскольку одни и те же символы можно
представить различными кодами, что иногда
затрудняет обработку, существуют процессы
нормализации, предназначенные для
приведения текста к определённому
стандартному виду.

Case folding – приведение символа или
строки к заданному регистру (м. б. 1–3)

Collation (UCA)
алгоритм сравнения двух строк, с учетом
особенностей Unicode
ICU
International Components for
Unicode
 набор C-библиотек для
разработки программ с
поддержкой Unicode
Для Python есть pyICU
в Perl5 не используется!
☕
Часть 3


 Домашняя
  работа
Зачем учить?
«Все-таки UTF8
 в перле - это
немного черная
    магия»
 Alex Povolotsky, рассылка
        Moscow.pm
Как учить?
презентации tchrist (OSCON 2011)

утилиты tchrist

http://stackoverflow.com/questions/6162484/
why-does-modern-perl-avoid-utf-8-by-
default/6163129#6163129 

http://local.joelonsoftware.com/wiki/
Абсолютный_Минимум,_который_Каждый_
Разработчик_Программного_Обеспечения_
Обязательно_Должен_Знать_о_Unicode_и_
Наборах_Символов

http://ru.wikipedia.org/wiki/Юникод

http://perldoc.perl.org/search.html?q=perluni
Еще ссылки
http://shapecatcher.com/
http://unicode.org/resources/
online-tools.html (http://
unicodinator.com/)
http://event.perlrussia.org/
saintperl3/talk/158


training.perl.com   ☠☠☠
«возможно, я не смог раскрыть
всё, что надо знать о кодировках
    символов и Unicode, но я
 надеюсь, что если вы не уснули
  до этого места, вы уже знаете
достаточно, чтобы возвратиться
     к программированию и
   использовать антибиотики
вместо пиявок и кровопусканий»
как стать экспертом по
   работе с кодировками
«Encoding is for i/o; in the Perl space, text must be
Perl character strings.
I repeat: Encoding is for i/o; in the Perl space, text
must be Perl character strings.
Write that 100 times, display it next to your
monitor(s), record it and play it whilst sleeping on
your ipod for one week, have it tattooed on your
fingers, and in no time you'll be known as the
encoding guru in your company»
http://sigstp.blogspot.com/

Más contenido relacionado

Similar a «Unicode. Ликбез»

Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelMikhail Kurnosov
 
Интернационализация ПО: тонкости культуры в разработке
Интернационализация ПО: тонкости культуры в разработкеИнтернационализация ПО: тонкости культуры в разработке
Интернационализация ПО: тонкости культуры в разработкеCUSTIS
 
Операционные системы
Операционные системыОперационные системы
Операционные системыyaevents
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSUlarhat
 
лекция1
лекция1лекция1
лекция1shagore
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийOOO "Program Verification Systems"
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail Kurnosov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
Лекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системЛекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системpianist2317
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиAndrey Karpov
 
GetDev.NET: Снова Эрланг
GetDev.NET: Снова ЭрлангGetDev.NET: Снова Эрланг
GetDev.NET: Снова ЭрлангMaxim Krentovskiy
 
Недостатки Linux API с точки зрения разработчика веб-сервера.
Недостатки Linux API с точки зрения разработчика веб-сервера.Недостатки Linux API с точки зрения разработчика веб-сервера.
Недостатки Linux API с точки зрения разработчика веб-сервера.Alexandr Nox
 
F# - функциональный язык «новой» волны
F# - функциональный  язык «новой» волныF# - функциональный  язык «новой» волны
F# - функциональный язык «новой» волныKiev ALT.NET
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Mikhail Kurnosov
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin
 

Similar a «Unicode. Ликбез» (20)

Язык параллельного программирования Cray Chapel
Язык параллельного программирования Cray ChapelЯзык параллельного программирования Cray Chapel
Язык параллельного программирования Cray Chapel
 
Интернационализация ПО: тонкости культуры в разработке
Интернационализация ПО: тонкости культуры в разработкеИнтернационализация ПО: тонкости культуры в разработке
Интернационализация ПО: тонкости культуры в разработке
 
Лекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и системЛекция №1 Организация ЭВМ и систем
Лекция №1 Организация ЭВМ и систем
 
Операционные системы
Операционные системыОперационные системы
Операционные системы
 
CUDA Course 2010 at MSU
CUDA Course 2010 at MSUCUDA Course 2010 at MSU
CUDA Course 2010 at MSU
 
лекция1
лекция1лекция1
лекция1
 
PVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложенийPVS-Studio, решение для разработки современных ресурсоемких приложений
PVS-Studio, решение для разработки современных ресурсоемких приложений
 
Лекция № 3 Организация ЭВМ и систем
Лекция № 3 Организация ЭВМ и системЛекция № 3 Организация ЭВМ и систем
Лекция № 3 Организация ЭВМ и систем
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
Step cpp0201
Step cpp0201Step cpp0201
Step cpp0201
 
Лекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и системЛекция №3 Организация ЭВМ и систем
Лекция №3 Организация ЭВМ и систем
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
 
GetDev.NET: Снова Эрланг
GetDev.NET: Снова ЭрлангGetDev.NET: Снова Эрланг
GetDev.NET: Снова Эрланг
 
Кратко о Linux
Кратко о LinuxКратко о Linux
Кратко о Linux
 
Недостатки Linux API с точки зрения разработчика веб-сервера.
Недостатки Linux API с точки зрения разработчика веб-сервера.Недостатки Linux API с точки зрения разработчика веб-сервера.
Недостатки Linux API с точки зрения разработчика веб-сервера.
 
F# - функциональный язык «новой» волны
F# - функциональный  язык «новой» волныF# - функциональный  язык «новой» волны
F# - функциональный язык «новой» волны
 
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
Лекция 2. Оптимизация ветвлений и циклов (Branch prediction and loop optimiz...
 
Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)Viacheslav Eremin about DOT NET (rus lang)
Viacheslav Eremin about DOT NET (rus lang)
 
Invisible
InvisibleInvisible
Invisible
 

«Unicode. Ликбез»

  • 2. Ликбе́з (ликвида́ция безгра́мотности) В переносном смысле — обучение неподготовленной аудитории базовым понятиям какой-либо науки, процесса или явления.
  • 3. Упрощенец – тот, кто поверхностно, не вникая в суть, подходит к решению сложных задач, вопросов.
  • 4. Часть 1 Задачка, в процессе решения которой, автор пришел к пониманию своего невежества
  • 7. Решение №1 use 5.014; use utf8; use Unicode::Normalize; binmode STDOUT, ':encoding(UTF-8)'; my $str = "Îñţérñåţîöñåļîžåţîöñ"; my $look = "Nation"; say "before: $strn"; $str = NFD($str); $str =~ s/pM//og; # remove "marks" say "after: $str"; say "is_match: ", $str =~ /$look/i || 0;
  • 8. tchrist: «This is the wrong way to do it. You need to use a UCA match at level 1»
  • 9. Решение №2 use 5.014; use utf8; use Unicode::Collate; my $str = "Îñţérñåţîöñåļîžåţîöñ"; my $look = "Nation"; my $Collator = Unicode::Collate->new( normalization => undef, level => 1 ); my @match = $Collator->match($str, $look); say “matches: ” . join(“, “, @match);
  • 10. «Code that assumes you can remove diacritics to get at base ASCII letters is evil, still, broken, brain-damaged, wrong, and justification for capital punishment»
  • 11. ?
  • 12. Часть 2 Ликбез
  • 13.  Unicode – это не кодировка или таблица символов. Это стандарт! В который входит, кроме таблиц символов и правил их кодирования, еще много-много всего
  • 14. Стандарт Unicode таблицы символов, несколько механизмов кодирования формы нормализации текста правила casemapping, casefolding гибкие правила collation правила переносов для слов и разбиения строк специальные правила для регулярных выражений тысячи именованых свойств (properties) численные эквивалентности (U+216B XII) направление текста .... много всего другого ....
  • 16. UCS (ucs-2, ucs-4) универсальный набор символов (англ. UCS, universal character set)  задаёт однозначное соответствие символов кодам — элементам кодового пространства, представляющим неотрицательные целые числа. определен в стандарте ISO/IEC 10646 (включен в стандарт Unicode)
  • 17. UCS, продолжение... запись Unicode символов вида: U+0075 пример: u (U+0075 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴜ) + ¨(U+0308 ᴄᴏᴍʙɪɴɪɴɢ ᴅɪᴀᴇʀᴇsɪs) => ü mac: unicode hex input (l&t), option + code windows: alt + “+” + code www.fileformat.info/info/unicode/char/search.htm .../search.htm?q=diacritic&preview=entity
  • 18. Кодовое пространство (codespace) в Unicode разбито на 17 плоскостей по 2^16 (65536) code points (кодовых точек) набор всех code points: 0hex to 10FFFFhex Нулевая плоскость называется Basic Multilingual Plane (BMP) в ней расположены символы наиболее употребительных письменностей.  Т.е. это все что в диапазоне 0x0 - 0xFFFF (не все используются, верхняя часть диапазона зарезервирована)
  • 19. Unicode transformation format UTF-16BE, UTF-16LE UTF-32BE, UTF-32LE UTF-8, UTF-EBCDIC BE (big-endian) – от старшего к младшему LE (little-endian) – от младшего к старшему если нет BOM (о нем ниже) то стандартом предписывается  BE (тупоконечный)
  • 20. BOM byte order mark Важен для UTF-16 и UTF-32. (для определения тупо/остро- конечности) Для UTF-8 обычно не нужео, но есть в стандарте и часто используется в Windows. UTF-16,32 программы по BOM могут понять (если захотят), что в файле utf-8.
  • 21. UTF-16 включает в себя UCS-2, как подмножество особенность кодировки, что символы не из 0-й plane  задаются составными кодами 16+16=32 бита или суррогатными парами
  • 22. UTF-32 фиксированной ширины, всегда 4 байта, UTF-32/UCS-4 requires four bytes to encode any character.  http://en.wikipedia.org/wiki/UTF-32/UCS-4
  • 23. UTF-8 Unix/Web кодировка 2/09/1992 К. Томпсон & Р. Пайк ASCII-совместима, 1–6 байт (4) BOM – не нужен! UTF-EBCDIC – редкая экзотика для мейнфреймов
  • 25. Композиция символов – cимволы задающиеся несколькими кодами. Для некоторых символов есть как композитные так и монолитные формы записи Ё (U+0401) и Й (U+0419),  Е +  ̈ (U+0415 U+0308) И +  ̆ (U+0418 U+0306) Character General Category – каждый code point относится к одной из основных категорий. Буква, знак (см диакр. знаки), число(number), пунктуационный знак, символ, разделитель (см. http://www.unicode.org/versions/Unicode6.0.0/ch02.pdf)
  • 26. Нормализация – Поскольку одни и те же символы можно представить различными кодами, что иногда затрудняет обработку, существуют процессы нормализации, предназначенные для приведения текста к определённому стандартному виду. Case folding – приведение символа или строки к заданному регистру (м. б. 1–3) Collation (UCA) алгоритм сравнения двух строк, с учетом особенностей Unicode
  • 27. ICU International Components for Unicode набор C-библиотек для разработки программ с поддержкой Unicode Для Python есть pyICU в Perl5 не используется!
  • 28.
  • 31. «Все-таки UTF8 в перле - это немного черная магия» Alex Povolotsky, рассылка Moscow.pm
  • 33. презентации tchrist (OSCON 2011) утилиты tchrist http://stackoverflow.com/questions/6162484/ why-does-modern-perl-avoid-utf-8-by- default/6163129#6163129  http://local.joelonsoftware.com/wiki/ Абсолютный_Минимум,_который_Каждый_ Разработчик_Программного_Обеспечения_ Обязательно_Должен_Знать_о_Unicode_и_ Наборах_Символов http://ru.wikipedia.org/wiki/Юникод http://perldoc.perl.org/search.html?q=perluni
  • 35. «возможно, я не смог раскрыть всё, что надо знать о кодировках символов и Unicode, но я надеюсь, что если вы не уснули до этого места, вы уже знаете достаточно, чтобы возвратиться к программированию и использовать антибиотики вместо пиявок и кровопусканий»
  • 36. как стать экспертом по работе с кодировками «Encoding is for i/o; in the Perl space, text must be Perl character strings. I repeat: Encoding is for i/o; in the Perl space, text must be Perl character strings. Write that 100 times, display it next to your monitor(s), record it and play it whilst sleeping on your ipod for one week, have it tattooed on your fingers, and in no time you'll be known as the encoding guru in your company» http://sigstp.blogspot.com/