Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
$ perl ./reverse.pl
ok 1 - '' -> ''
ok 2 - 'a' -> 'a'
ok 3 - 'ab' -> 'ba'
ok 4 - 'a b' -> 'b a'
ok 5 - 'ф' -> 'ф'
ok 6 - 'xф' -> 'фx'
ok 7 - 'yфz' -> 'zфy'
ok 8 - 'фх' -> 'хф'
ok 9 - 'Й' -> 'Й'
ok 10 - 'iЙ' -> 'Йi'
ok 11 - 'Йi' -> 'iЙ'
ok 12 - 'Йф' -> 'фЙ'
not ok 13 - 'zЙ̈y' -> 'yЙ̈z'
# Failed test ''zЙ̈y' -> 'yЙ̈z''
# at ./reverse.pl line 45.
# got: 'ÿЙz'
# expected: 'yЙ̈z'
1..13
# Looks like you failed 1 test of 13.
#!/usr/bin/perl
use warnings;
use strict;
use 5.012;
use open ':utf8', ':std';
use Test::More;
use Unicode::Normalize;
my @s = (
# тривиальные ascii-случаи
"", "",
"a", "a",
"ab", "ba",
"a b", "b a",
# одна русская буква, записанная в UTF-8
"\xd1\x84", "\xd1\x84",
# смесь русских и латинских букв
"x\xd1\x84", "\xd1\x84x",
"y\xd1\x84z", "z\xd1\x84y",
"\xd1\x84\xd1\x85", "\xd1\x85\xd1\x84",
# одна русская буква, записанная в декомпозированной форме
"\xd0\x98\xcc\x86", "\xd0\x98\xcc\x86",
# смесь русских декомпозированных и латинских букв
"i\xd0\x98\xcc\x86", "\xd0\x98\xcc\x86i",
"\xd0\x98\xcc\x86i", "i\xd0\x98\xcc\x86",
"\xd0\x98\xcc\x86\xd1\x84", "\xd1\x84\xd0\x98\xcc\x86",
# забавы ради: zЙ̈y
"z\xd0\x98\xcc\x86\xcc\x88y", "y\xd0\x98\xcc\x86\xcc\x88z"
);
# преобразуем значения @s из последовательностей байт в Unicode-строки
utf8::decode $_ for @s;
while (@s) {
my ($from, $to) = splice @s, 0, 2;
# NFC() возвращает Normalization Form C (formed by canonical
# decomposition followed by canonical composition)
# NFD() возвращает Normalization Form D (formed by canonical
# decomposition)
is NFD(reverse(NFC($from))), $to, "'$from' -> '$to'";
}
done_testing();
"qu\xe2\x80\xaewz" -> "zw\xe2\x80\xaeuq". С моей точки зрения, это правильно: ведь задача формулировалась как «записать Unicode-символы в обратном порядке».-webkit-transform: rotateY(180deg); кажется самым универсальным способом :)Юникод каждый раз найдёт способ вынести мозг :DВот поэтому важно чётко различать всё три сущности:
webkit-transform: rotateY(180deg);
конечно лучше всего :)
Обращение не ASCII-строки