Поддръжка на Unicode

Започвайки с Perl 5.6, преводачът е реализирал поддръжка на Unicode на езиково ниво. Този текст ще обсъди защо е необходим, как може да се използва и какви проблеми ще трябва да срещнете.

Съдържание

Всеки UTF формат е обратим, т.е. поддържа конвертиране от последователност от Unicode символи и обратно без загуба, т.е.: в резултат на конвертиране на всяка последователност от Unicode символи С в последователност от байтове и обратно, получаваме отново С. За да се постигне възможност за преобразуване без загуби в двете посоки, UTF форматът трябва да дефинира преобразуване за всички Unicode символи, дори невалидни.

Безплатен съкратен превод на What is a UTF?

Perl и Unicode

Unicode в Perl 5.6.x и 5.8.x

Поддръжката на Unicode в Perl 5.6 е свързана с операции, а не с данни, което изисква използването на прагмата "utf8" и само когато програмистът е сигурен, че всички данни са кодирани в UTF-8. Също така Perl 5.6 не поддържа Unicode в регулярни изрази, което значително ограничава обхвата на възможностите.

Знам твърде малко за използването на Unicode в 5.6, за да пиша за него. Всички примери и текст по-долу са за Perl 5.8.x. Ако някой иска, можете да подчертаете характеристиките 5.6. Руслан Закиров [досие]

Как се изпълнява поддръжката на Perl

Всяка структура от данни (скалар, масив, хеш.) В Perl има набор от флагове, които отразяват определени свойства на обектите. За да се приложи пълна поддръжка за Unicode, беше избран форматът UTF-8 и бе въведено едноименното знаме. Всички функции, които работят по низове по един или друг начин, вземат предвид флага и интерпретират данните по различен начин в зависимост от стойността им. Тези функции включват: дължина, chr, ord, substr, join, регулярни изрази и други. Следващият пример демонстрира разликите в поведението (използваният модул Encode е включен в дистрибуцията на Perl от Perl 5.8):

Една и съща информация в два формата: последователност от байтове (октети), кодирани в cp1251 с деактивиран флаг и поредица от символи, кодирани в UTF-8 с зададен флаг. Функцията за дължина връща една и съща стойност и в двата случая, тъй като cp1251 използва един байт за съхраняване на един символ, а за низове без флаг това е броят на върнатите байтове. Разликите в поведението на функциите ord и substr са очевидни. Като експеримент опитайте да деактивирате флага на UTF-8, като коментирате реда Encode: _ utf8_off ($ string); .

Какви кодировки се поддържат в Perl

Както вече споменахме по-горе, Perl преобразува от "стари" кодировки в UTF-8, за всички преобразувания се използва модулът Encode, тоест зависи от този модул, за да се възползвате от автоматичното преобразуване на данни.

За всяко кодиране, което се поддържа, определено има име "канон" и евентуално редица синоними. Освен това имената на кодиранията не са чувствителни към малки и малки букви и интервалите се заменят с тире.

Различни кодировки са групирани в модули, например поддръжката за UTF- * кодиране е реализирана в модула Encode: Unicode. Не е необходимо сами да зареждате тези модули, но може би за рядко използвани кодировки ще трябва да инсталирате допълнителни модули от CPAN .

Можете да видите списък с всички канонични имена на всички използвани кодировки

или вижте каноничните имена, поддържани от отделен модул

Ако не можете да намерите необходимото кодиране в списъка, тогава може би това е синоним на друго кодиране. Можете да използвате следния малък скрипт, за да определите дали се поддържа това или онова кодиране, а името е канонично или е синоним:

Вижте perldoc Encode: Поддържа се за подробности кои кодове се поддържат. .

Perl и стандарти