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;
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»
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
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
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/