англійськафранцузькаіспанська

Значок OnWorks

perlunicode - онлайн у хмарі

Запустіть perlunicode у безкоштовному хостинг-провайдері OnWorks через Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

Це команда perlunicode, яку можна запустити в безкоштовному хостинг-провайдері OnWorks за допомогою однієї з наших безкоштовних онлайн-робочих станцій, таких як Ubuntu Online, Fedora Online, онлайн-емулятор Windows або онлайн-емулятор MAC OS

ПРОГРАМА:

ІМ'Я


perlunicode - підтримка Unicode в Perl

ОПИС


Якщо ви ще цього не зробили, перш ніж читати цей документ, вам слід ознайомитися з обома
perlunitut і perluniintro.

Unicode має на меті UNI-фай ан-КОД-інги всіх світових наборів символів в один
Стандартний. Для багатьох різноманітних стандартів кодування, які існували, коли був Unicode
уперше створений, перетворення з кожного на Unicode по суті означало додавання константи до кожного
кодову точку в оригінальному стандарті, а перетворення назад означало просто віднімання цього самого
постійний. Для ASCII та ISO-8859-1 константа дорівнює 0. Для ISO-8859-5 (кирилиця)
константа дорівнює 864; для івриту (ISO-8859-8) це 1488; Тайський (ISO-8859-11), 3424; і так
вперед. Це полегшило виконання перетворень і сприяло прийняттю Unicode.

І це спрацювало; нині ці застарілі стандарти використовуються рідко. Користуються майже всі
Unicode.

Юнікод — це комплексний стандарт. Він визначає багато речей, що виходять за рамки Perl,
наприклад, як відображати послідовності символів. Для повного обговорення всіх аспектів
Unicode, дивhttp://www.unicode.org>.

Важливий Застереження
Незважаючи на те, що частина цього розділу може бути незрозумілою для вас з першого читання, ми
думаю, що досить важливо висвітлити деякі недоліки, перш ніж заглиблюватися далі, тому
ось іде:

Підтримка Unicode є великою вимогою. Хоча Perl не реалізує Unicode
стандарт або супровідні технічні звіти від корки до корки, Perl підтримує багато
Особливості Unicode.

Крім того, використання Unicode може спричинити неочевидні проблеми безпеки. Читайте Unicode
Міркування безпекиhttp://www.unicode.org/reports/tr36>.

Найбезпечніше, якщо ви "використовуєте функцію 'unicode_strings'"
Щоб зберегти зворотну сумісність, Perl не вмикає повну внутрішню роботу
Підтримка Unicode, якщо не вказано прагму «використовувати функцію 'unicode_strings'». (Це
вибирається автоматично, якщо ви «використовуєте 5.012» або вище.) Якщо цього не зробити, можна
викликати несподівані сюрпризи. Див. «Помилка Unicode»» нижче.

Ця прагма не впливає на введення/виведення. Це також не змінює внутрішнього представлення
рядки, тільки їх інтерпретація. Є ще кілька місць, де Unicode
не підтримується повністю, наприклад, у назвах файлів.

Вхідні та вихідні рівні
Використовуйте рівень ":encoding(...)" для читання та запису в описувачі файлів за допомогою
вказане кодування. (Див. відкрито.)

Вам слід перетворити ваші сценарії Perl не-ASCII, не-UTF-8 на UTF-8.
Дивіться кодування.

«використовувати utf8» все ще потрібно, щоб увімкнути UTF-8 у сценаріях
Якщо ваш сценарій Perl сам закодований у UTF-8, прагма «використовувати utf8» має бути
явно включено, щоб дозволити розпізнавання цього (у рядку або регулярному виразі
літерали або в іменах ідентифікаторів). це is тільки час коли an явний «використовувати utf8"
is необхідний (Див. utf8).

Сценарії з позначкою "BOM" і сценарії UTF-16 визначаються автоматично
Однак, якщо сценарій Perl починається з Unicode "BOM" (UTF-16LE, UTF16-BE або
UTF-8), або якщо сценарій виглядає як UTF-16 без позначки "BOM" будь-якої з байтів, Perl
буде правильно читатися в сценарії як відповідне кодування Unicode. (без "BOM".
UTF-8 не можна ефективно розпізнати або відрізнити від ISO 8859-1 чи іншого
восьмибітове кодування.)

Байт та Характер Семантика
До Unicode більшість кодувань використовували 8 біт (один байт) для кодування кожного символу. Таким чином
символ був байтом, а байт був символом, і їх могло бути лише 256 або менше
можливі символи. «Семантика байтів» у назві цього розділу стосується цього
поведінка. Не було потреби розрізняти «Байт» і «Символ».

Потім з’являється Unicode, який містить більше мільйона символів (і Perl дозволяє
навіть більше). Це означає, що для представлення символу може знадобитися більше ніж один байт
це, і тому два терміни більше не еквівалентні. Яке значення мають персонажі
цілі сутності, а не байти, які їх складають. Ось що таке термін
«Семантика символів» у назві цього розділу стосується.

Perl довелося змінити всередині, щоб відокремити «байти» від «символів». Важливо, що
Ви також змінюєте свої ідеї, якщо ви ще цього не зробили, так що "байт" і "символ" ні
довше означає те саме у вашій свідомості.

Основним будівельним блоком рядків Perl завжди був «символ». Зміни
в основному зводиться до того, що реалізація більше не вважає символ завжди
лише один байт.

Слід звернути увагу на різні речі:

· Функції обробки рядків, здебільшого, продовжують працювати в термінах
персонажів. "length()", наприклад, повертає кількість символів у рядку,
як і раніше. Але це число вже не обов’язково збігається з числом
байтів у рядку (може бути більше байтів, ніж символів). Другий такий
функції включають "chop()", "chomp()", "substr()", "pos()", "index()", "rindex()",
"sort()", "sprintf()" і "write()".

Винятки становлять:

· біт-орієнтований "vec"

· байт-орієнтований формат "pack"/"unpack" "C".

Однак специфікатор "W" працює з цілими символами, як і "U"
специфікатор.

· деякі оператори, які взаємодіють з операційною системою платформи

Прикладами є оператори, що працюють з іменами файлів.

· коли функції викликаються в межах прагми «використовувати байти».

Ймовірно, ви все одно повинні використовувати це лише для налагодження.

· Рядки, включаючи хеш-ключі, і шаблони регулярних виразів можуть містити символи
які мають порядкові значення більше 255.

Якщо для редагування програми ви використовуєте редактор Unicode, можуть з’явитися символи Unicode
безпосередньо в рядках літералів у кодуванні UTF-8 або UTF-16. (Колишній
вимагає "BOM" або "use utf8", для останнього потрібна "BOM".)

«Створення Юнікоду» в perluniintro надає інші способи розміщення символів, відмінних від ASCII
твої струни.

· Функції "chr()" і "ord()" працюють з цілими символами.

· Регулярні вирази відповідають цілим символам. Наприклад, "." відповідає цілому
замість одного байта.

· Оператор "tr///" перекладає цілі символи. (Зверніть увагу, що "tr///CU"
функціональність видалено. Щоб дізнатися про подібну функціональність, перегляньте "pack('U0',
...)" і "pack('C0', ...)").

· "scalar reverse()" обертає за символом, а не за байтом.

· Оператори бітового рядка, "& | ^ ~" і (починаючи з версії 5.22) "&. |. ^. ~." може працювати
на символах, які не вміщуються в байт. Проте нинішня поведінка ймовірно
змінити. Не слід використовувати ці оператори для рядків, закодованих у UTF-8. Якщо
Ви не впевнені щодо кодування рядка, понизьте його перед використанням будь-якого з цих
оператори; ви можете використовувати "utf8::utf8_downgrade()".

Суть полягає в тому, що Perl завжди практикував «семантику символів», але з
поява Юнікоду, який тепер відрізняється від "Семантики байтів".

ASCII Правила в порівнянні з Unicode Правила
До Unicode, коли символ був байтом, був символом, Perl знав лише про 128
символи, визначені ASCII, кодові точки від 0 до 127 (крім розділу "використовувати мову").
Це залишило кодові точки від 128 до 255 непризначеними та доступними для будь-якого використання a
програма може знадобитися. Єдиною семантикою, яку вони мають, є їхні порядкові числівники, і що вони
не є членами жодного з класів невід’ємних символів. Жоден не вважається відповідним
Наприклад, "\w", але всі відповідають "\W".

Юнікод, звичайно, надає кожній із цих кодових точок певне значення (разом із
вище 255). Щоб зберегти зворотну сумісність, Perl використовує лише значення Unicode
коли є певні ознаки того, що Юнікод призначений; інакше не-ASCII
кодові точки залишаються обробляються як непризначені.

Ось як Perl дізнається, що рядок слід розглядати як Unicode:

· В рамках "використання utf8"

Якщо вся програма є Unicode (позначається використанням 8-біт Uнікод Tперетворення
Format), тоді всі рядки в ньому мають бути Unicode.

· В рамках «використання функції 'unicode_strings'»

Ця прагма була створена, щоб ви могли явно повідомити Perl, що операції виконано
в його межах є використання правил Unicode. Більше операцій впливають на новіші
перли. Див. «Помилка Unicode».

· У межах "використання 5.012" або вище

Це неявно вмикає "використовувати функцію 'unicode_strings'".

· В рамках «використовувати локаль 'not_characters'» або «використовувати локаль» і поточний
locale — це локаль UTF-8.

Перше визначено як обробка Unicode; а останній вказує на Unicode
locale, отже, інтерпретація Unicode всіх рядків у ньому.

· Коли рядок містить лише кодову точку Unicode

Perl ніколи не приймав кодові точки вище 255 без Unicode, тому їх використання
означає Unicode для всього рядка.

· Коли рядок містить кодову точку Юнікод із назвою "\N{...}"

Конструкція "\N{...}" явно посилається на кодову точку Unicode, навіть якщо це один
це також в ASCII. Тому рядок, що його містить, має бути Unicode.

· Коли рядок надійшов із зовнішнього джерела, позначеного як Unicode

Параметр командного рядка "-C" може вказати, що певні вхідні дані програми є
Unicode, і значення цього може бути прочитано вашим кодом Perl, див. "${^UNICODE}" у
perlvar.

· Коли рядок було оновлено до UTF-8

Функцію "utf8::utf8_upgrade()" можна явно використовувати для постійного використання (якщо не
наступний виклик "utf8::utf8_downgrade()" призводить до того, що рядок розглядатиметься як
Unicode.

· Є додаткові методи для шаблонів регулярних виразів

Шаблон, який скомпільовано з модифікаторами "/u" або "/a", розглядається як Unicode
(хоча є деякі обмеження з "/a"). Під модифікаторами "/d" і "/l"
є кілька інших ознак для Unicode; див. «Модифікатори набору символів» у
perlre.

Зауважте, що все вищезазначене перевизначено в межах "використання байтів"; але ви повинні
використовуйте цю прагму лише для налагодження.

Зауважте також, що деякі взаємодії з операційною системою платформи ніколи не використовують Unicode
правила.

Коли діють правила Unicode:

· Оператори перекладу регістру використовують таблиці перекладу регістру Unicode.

Зверніть увагу, що "uc()" або "\U" в інтерпольованих рядках перекладається на верхній регістр, тоді як
"ucfirst" або "\u" в інтерпольованих рядках перекладається на регістр заголовків у мовах, які
розрізняйте (що еквівалентно верхньому регістру в мовах без
відмінність).

Існує модуль CPAN, "Unicode::Casing", який дозволяє вам визначати власний
зіставлення для використання в "lc()", "lcfirst()", "uc()", "ucfirst()" і "fc" (або їх
вбудовані версії рядків у подвійних лапках, наприклад "\U"). (До Perl 5.16 це
функціональні можливості були частково надані в ядрі Perl, але страждали від ряду
нездоланні недоліки, тому замість нього був написаний модуль CPAN.)

· Класи символів у регулярних виразах збігаються на основі властивостей символів
указано в базі даних властивостей Unicode.

"\w" можна використовувати, наприклад, для відповідності японському ідеографу; і "[[:цифра:]]" a
Бенгальське число.

· Можна використовувати іменовані властивості Unicode, сценарії та діапазони блоків (наприклад, у дужках
класи символів) за допомогою конструкції "\p{}" "відповідає властивості" та "\P{}"
заперечення, "не відповідає властивості".

Для отримання додаткової інформації див. «Властивості символів Unicode».

Ви можете визначити власні властивості символів і використовувати їх у регулярному виразі
з конструкцією "\p{}" або "\P{}". Додаткову інформацію див. у розділі «Властивості символів, визначених користувачем».
подробиці

Розширений Графема Кластери (Логічно символів)
Розгляньте символ, скажіть «Н». Навколо нього можуть бути різні позначки, наприклад
гострий наголос, або циркумфлекс, або різні гачки, кружечки, стрілки, і т.п., вище, нижче, до
одна чи інша сторона, і т.д.. Серед мов світу є багато можливостей.
Кількість комбінацій астрономічна, і якби для кожної був свій символ
комбінація, вона скоро вичерпає понад мільйон можливих символів Unicode. Так
Unicode застосував інший підхід: є символ для основи "H" і символ
для кожної з можливих позначок, і їх можна по-різному комбінувати, щоб отримати кінцеву логіку
характер. Таким чином, логічний символ - те, що здається одним символом - може бути a
послідовність більш ніж одного окремого символу. Стандарт Юнікод називає це
«розширені графемні кластери» (це вдосконалена версія, яка більше не використовується
«графемний кластер»); Perl надає конструкцію регулярного виразу "\X", щоб відповідати таким
послідовності в повному обсязі.

Але намір Unicode полягає в тому, щоб уніфікувати існуючі стандарти набору символів і практику
кілька існуючих стандартів мають окремі символи, які означають те саме, що й деякі з них
ці комбінації, наприклад ISO-8859-1, де їх досить багато. Наприклад, «ЛАТИНСЬКА
ВЕЛИКА ЛІТЕРА Е З АКУТОМ" вже була в цьому стандарті, коли з’явився Unicode.
Тому Юнікод додав його до свого репертуару як єдиний символ. Але цей персонаж
Юнікод вважає еквівалентом послідовності, що складається з символу
«ВЕЛИКА ЛАТИНСЬКА ЛІТЕРА E», за якою йде символ «COMBINING ACUTE ACCENT».

«ВЕЛИКА ЛАТИНСЬКА ЛІТЕРА E З АКУТОМ» називається «попередньо складеним» символом, а його
еквівалентність з «Е» і послідовністю «КОМБІНЦІЙНИЙ НАГОЛОС» називається канонічної
еквівалентність. Кажуть, що всі попередньо складені символи мають розкладання (на
еквівалентна послідовність), а тип розкладання також називають канонічним. Рядок може
складатися якомога більше з попередньо складених символів або може складатися з
повністю розкладені персонажі. Юнікод називає їх відповідно «формою нормалізації».
Composed» (NFC) і «Normalization Form Decomposed». Модуль «Unicode::Normalize».
містить функції, які перетворюють між двома. Рядок також може мати обидва складені
персонажі та розкладені персонажі; цей модуль можна використовувати, щоб зробити все це одним або іншим
інший.

Вам можуть бути представлені рядки в будь-якій із цих еквівалентних форм. В даний час є
немає нічого в Perl 5, що ігнорує відмінності. Тож вам доведеться його спеціально обробляти.
Звичайна порада полягає в тому, щоб перед подальшою обробкою перетворити введені дані в "NFD".

Для отримання більш детальної інформації дивhttp://unicode.org/reports/tr15/>.

Unicode Характер властивості
(Єдиний раз, коли Perl розглядає послідовність окремих кодових точок як одну
логічний символ знаходиться в конструкції "\X", про яку вже згадувалося вище. тому
"символ" у цьому обговоренні означає одну кодову точку Unicode.)

Майже всі властивості символів Unicode доступні через регулярні вирази
використання конструкції "\p{}" "відповідає властивості" та "\P{}" "не відповідає властивості" для
його заперечення.

Наприклад, "\p{Uppercase}" відповідає будь-якому окремому символу з Unicode "Uppercase"
властивість, тоді як "\p{L}" відповідає будь-якому символу з "Загальною_категорією" "L" (літера)
властивість (див. «Загальна_категорія» нижче). Дужки не потрібні для однієї літери
імена властивостей, тому "\p{L}" еквівалентно "\pL".

Формальніше кажучи, "\p{Великий регістр}" відповідає будь-якому одному символу, у якому Юнікод "Великий регістр"
значення властивості дорівнює "True", а "\P{Uppercase}" відповідає будь-якому символу, чий "Великий регістр"
значення властивості "False", і їх можна було б записати як "\p{Uppercase=True}" і
"\p{Uppercase=False}", відповідно.

Ця формальність потрібна, коли властивості не є двійковими; тобто, якщо вони можуть взяти більше
значення, ніж просто "Істинно" і "Хибно". Наприклад, властивість "Bidi_Class" (див
«Типи двонаправлених символів» нижче), можуть приймати кілька різних значень, наприклад
«Ліворуч», «Праворуч», «Пробіл» та ін. Щоб узгодити їх, потрібно вказати обидва
ім'я властивості ("Bidi_Class") ТА значення, яке порівнюється ("Left", "Right", і т.п.).
Це робиться, як і в наведених вище прикладах, шляхом розділення двох компонентів рівним знаком
знак (або взаємозамінний двокрапка), наприклад "\p{Bidi_Class: Left}".

Усі властивості символів, визначені Unicode, можна записати в цих складених формах
"\p{property=value}" або "\p{властивість:значення}", але Perl надає деякі додаткові властивості
які записуються лише в одній формі, а також одноформові скорочення для всіх двійкових
властивості та деякі інші, описані нижче, у яких ви можете опустити назву властивості та
дорівнює або двокрапка.

Більшість властивостей символів Unicode мають принаймні два синоніми (або псевдоніми, якщо вам більше подобається): a
короткий, який легше друкувати, і довший, який є більш описовим, а отже
легше зрозуміти. Таким чином, наведені вище властивості "L" і "Letter" еквівалентні і можуть
використовувати як взаємозамінні. Так само «верхній» є синонімом «верхнього регістру», і ми могли б
написали "\p{Uppercase}" еквівалентно "\p{Upper}". Крім того, зазвичай є
різні синоніми для значень властивості. Для бінарних властивостей "True" має 3
синоніми: «Т», «Так», «У»; і "False" має відповідно "F", "Ні" і "N". Але бути
обережний. Коротка форма значення для однієї властивості може означати не те саме, що те саме
коротка форма для іншого. Таким чином, для властивості "General_Category" "L" означає "Letter",
але для властивості "Bidi_Class" "L" означає "Left". Повний список властивостей і
синоніми в perluniprops.

Різниця в іменах і значеннях властивостей у верхньому/нижньому регістрі не має значення; таким чином "\p{Верхній}"
означає те саме, що "\p{upper}" або навіть "\p{UpPeR}". Так само можна додати або
відніміть підкреслення в будь-якому місці в середині слова, щоб вони також були еквівалентними
до "\p{U_p_p_e_r}". І пробіли не мають значення поруч із несловесними символами, наприклад
як фігурні дужки та роздільники рівності або двокрапки, тому "\p{ Upper }" і "\p{ Upper_case
: Y }" також еквівалентні цим. Фактично, пробіли та навіть дефіси зазвичай можуть
додавати або видаляти будь-де. Таким чином, навіть "\p{ Up-per case = Yes}" є еквівалентним. Все це
Юнікод називається "вільним збігом". Кілька місць, де використовується суворіша відповідність
в середині чисел і у властивостях розширення Perl, які починаються або закінчуються на
підкреслення. Точніша відповідність піклується про пробіли (за винятком суміжних із несловами
символи), дефіси та невнутрішні символи підкреслення.

Ви також можете використовувати заперечення як у "\p{}", так і в "\P{}", ввівши каретку ("^") між
перша дужка та назва властивості: "\p{^Tamil}" дорівнює "\P{Tamil}".

Майже всі властивості захищені від зіставлення без урахування регістру. Тобто додавання "/i"
модифікатор регулярного виразу не змінює те, що їм відповідає. Є два набори
постраждали. Перший набір — «Велика_літера», «Мала_літера» і
"Titlecase_Letter", усі з яких відповідають "Cased_Letter" під відповідністю "/i". І другий
набором є "Великий регістр", "Малий регістр" і "Регістр заголовка", усі вони відповідають "Регістру" в "/i"
відповідність. Цей набір також включає його підмножини "PosixUpper" і "PosixLower", обидва з яких
під "/i" збігається з "PosixAlpha". (Різниця між цими наборами полягає в тому, що деякі речі,
як-от римські цифри, пишуться як великими, так і нижніми літерами, тож вони мають регістр, але не є такими
вважаються листами, тому вони не належать до "Cased_Letter".)

Перегляньте розділ «Окрім кодових точок Unicode», щоб дізнатися про особливі міркування під час зіставлення Unicode
властивості проти кодових точок, відмінних від Unicode.

Загальна_категорія

Кожному символу Unicode призначається загальна категорія, яка є «найзвичайнішою».
категоризація персонажа» (відhttp://www.unicode.org/reports/tr44>).

Складений спосіб їх запису виглядає як "\p{General_Category=Number}" (коротко:
"\p{gc:n}"). Але Perl надає ярлики, у яких все вгору через рівний або
роздільник двокрапки опущено. Тож замість цього ви можете просто написати "\pN".

Ось коротка та довга форми значень властивості "Загальна категорія", які може мати:

Короткий довгий

L Лист
LC, L& Cased_Letter (тобто: [\p{Ll}\p{Lu}\p{Lt}])
Lu Велика_літера
Ll Мала літера
Lt Titlecase_Letter
Lm Modifier_Letter
Lo Other_Letter

М Марк
Mn Nonspacing_Mark
Mc Інтервал_Марк
Me Enclosing_Mark

N число
Nd Decimal_Number (також цифра)
Nl Letter_Number
Немає іншого_номера

P Пунктуація (також Punct)
Роз’єм ПК_Пунктуація
Pd Тире_Пунктуація
Ps Open_Punctuation
Pe Close_Punctuation
Pi Initial_Punctuation
(може поводитися як Ps або Pe залежно від використання)
Pf Кінцевий_розділовий знак
(може поводитися як Ps або Pe залежно від використання)
Po Інші_розділові знаки

Символ S
Sm Math_Symbol
Sc Currency_Symbol
Sk Modifier_Symbol
Отже, інший_символ

Роздільник Z
Zs Space_Separator
Zl Розділювач_рядків
Zp Розділювач_абзаців

C Інше
Cc Control (також Cntrl)
Cf Формат
Cs Сурогат
Co Private_Use
Cn Не призначено

Властивості, що складаються з однієї літери, збігаються з усіма символами будь-якої підвластивості, що складається з двох літер
починаючи з тієї самої літери. "LC" і "L&" особливі: обидва є псевдонімами для набору
складається з усього, що відповідає "Ll", "Lu" та "Lt".

Двонаправлений Характер типи

Оскільки шрифти відрізняються своєю спрямованістю (іврит і арабська написані правильно
ліворуч, наприклад) Unicode надає властивість "Bidi_Class". Деякі з цінностей це
майно може мати:

Значення Значення

L Зліва направо
LRE Вбудовування зліва направо
Перевизначення LRO зліва направо
R Справа наліво
Арабська літера AL
Вбудовування RLE справа наліво
Перевизначення RLO справа наліво
Спрямований формат Pop Pop
Європейський номер EN
ES Європейський сепаратор
ET Європейський термінатор
Арабська цифра AN
Загальний роздільник CS
Знак без інтервалів NSM
BN Межа Нейтральна
B Розділювач абзаців
S Розділювач сегментів
WS Пробіл
ON Інші нейтралі

Ця властивість завжди записується у складеній формі. Наприклад, "\p{Bidi_Class:R}"
відповідає символам, які зазвичай пишуться справа наліво. На відміну від "Загальної_категорії"
ця властивість може мати більше значень, доданих у майбутньому випуску Unicode. Ті
перераховані вище складали повний набір для багатьох випусків Unicode, але були додані інші
в Unicode 6.3; ви завжди можете знайти поточні в perluniprops. І
<http://www.unicode.org/reports/tr9/> описує, як ними користуватися.

Сценарії

Мови світу написані багатьма різними шрифтами. Це речення (якщо ви не
читаючи його в перекладі) написано латиницею, тоді як російською мовою написано кирилицею, і
Грецька мова написана, добре, грецькою; Японська в основному в хірагані або катакані. Тут багато
більше.

Властивості Unicode "Script" і "Script_Extensions" визначають, який сценарій заданий символ
Будь-яку властивість можна вказати за допомогою складеної форми, наприклад "\p{Script=Hebrew}"
(скорочено: "\p{sc=hebr}") або "\p{Script_Extensions=Javanese}" (скорочено: "\p{scx=java}"). в
Крім того, Perl надає ярлики для всіх імен властивостей "Script". Ви можете опустити
все вгору через дорівнює (або двокрапку) і просто напишіть "\p{латиниця}" або
"\P{кирилиця}". (Це не стосується "Script_Extensions", яке має бути
пишеться у складеному вигляді.)

Різниця між цими двома властивостями включає символи, які використовуються в кількох
сценарії. Наприклад, цифри від «0» до «9» використовуються в багатьох частинах світу.
Вони розміщені в сценарії під назвою "Common". Інші символи використовуються лише в деяких
сценарії. Наприклад, «КАТАКАНА-ХІРАГАНА ДВІЙНИЙ ДЕФІС» використовується в обох японських мовах
сценарії, катакана та хірагана, але ніде більше. Властивість "Script" розміщує всі
символи, які використовуються в кількох сценаріях у сценарії "Загальний", тоді як
Властивість "Script_Extensions" розміщує розширення, які використовуються лише в кількох сценаріях, у кожен із них
ці сценарії; використовуючи «Загальні» для тих, що використовуються в багатьох сценаріях. Таким чином обидва
гра:

"0" =~ /\p{sc=Common}/ # Збіги
"0" =~ /\p{scx=Common}/ # Збіги

і тільки перший з них відповідає:

"\N{КАТАКАНА-ХІРАГАНА ПОДВІЙНИЙ ДЕФІС}" =~ /\p{sc=Common} # Збігів
"\N{КАТАКАНА-ХІРАГАНА ПОДВІЙНИЙ ДЕФІС}" =~ /\p{scx=Common} # Немає відповідності

І тільки останні два з них збігаються:

"\N{КАТАКАНА-ХІРАГАНА ПОДВІЙНИЙ ДЕФІС}" =~ /\p{sc=Хірагана} # Немає відповідності
"\N{КАТАКАНА-ХІРАГАНА ПОДВІЙНИЙ ДЕФІС}" =~ /\p{sc=Катакана} # Немає відповідності
"\N{КАТАКАНА-ХІРАГАНА ПОДВІЙНИЙ ДЕФІС}" =~ /\p{scx=Хірагана} # Збігів
"\N{КАТАКАНА-ХІРАГАНА ПОДВІЙНИЙ ДЕФІС}" =~ /\p{scx=Катакана} # Збігів

Таким чином, "Script_Extensions" є покращеним "Сценарієм", у якому менше символів у
«Загальний» сценарій і, відповідно, більше в інших сценаріях. Це нове в Unicode
версії 6.0, і її дані, ймовірно, суттєво зміняться в наступних випусках
розібратися. Новий код, ймовірно, має використовувати "Script_Extensions", а не простий
«Сценарій».

(Насправді, окрім "Загального", сценарій "Успадкований" містить символи, які використовуються в
кілька сценаріїв. Це символи-модифікатори, які успадковують значення сценарію
керуючий характер. Деякі з них використовуються в багатьох сценаріях, тому переходять у «Успадковані»
як у "Script", так і в "Script_Extensions". Інші використовуються лише в кількох скриптах
у «Inherited» у «Script», але не в «Script_Extensions».)

Варто підкреслити, що в Unicode є кілька різних наборів цифр
еквівалентні 0-9 і зіставляються за "\d" у регулярному виразі. Якщо вони використовуються в
лише однією мовою, вони знаходяться в «Сценарії» та «Розширенні_сценарію» цієї мови. Якщо
вони використовуються в кількох сценаріях, вони будуть у "sc=Common", але лише якщо вони є
використовується в багатьох сценаріях, якщо вони знаходяться в "scx=Common".

Повний список сценаріїв та їх ярликів міститься в perluniprops.

Скористайтесь of "Є" префікс

Для зворотної сумісності (з Perl 5.6), усі властивості можна записувати без використання
складена форма, згадана досі, може мати "Є" або "Є_" перед своєю назвою, отже
"\P{Is_Lu}", наприклад, дорівнює "\P{Lu}", а "\p{IsScript:Arabic}" дорівнює
"\p{арабська}".

блоки

На додаток до scripts, Unicode також визначає Блоки символів. Різниця між
сценаріїв і блоків полягає в тому, що концепція сценаріїв ближча до природних мов, а
концепція блоків — це скоріше штучне групування на основі груп Unicode
символи з послідовними порядковими значеннями. Наприклад, блок «Базова латиниця» — це все
символи, порядкові номери яких знаходяться від 0 до 127 включно; іншими словами, ASCII
персонажів. «Латинська» писемність містить деякі літери з цього, а також кілька інших
блоки, наприклад «Latin-1 Supplement», «Latin Extended-A», і т.п., але він містить не все
персонажі з цих блоків. Він, наприклад, не містить цифр 0-9,
тому що ці цифри є спільними для багатьох сценаріїв і, отже, знаходяться в сценарії "Загальний".

Щоб дізнатися більше про сценарії та блоки, перегляньте UAX#24 «Властивість сценарію Unicode»:
<http://www.unicode.org/reports/tr24>

Властивості «Script» або «Script_Extensions», імовірно, є тими, які ви хочете використовувати
при обробці природної мови; властивість "Блокувати" іноді може бути корисною в
робота з гайками та болтами Unicode.

Назви блоків зіставляються у складеній формі, наприклад "\p{Блок: стрілки}" або
"\p{Blk=Іврит}". На відміну від більшості інших властивостей, лише деякі імена блоків мають Unicode-
визначена коротка назва. Але Perl надає (невеликий, більше не рекомендований) ярлик:
Ви можете сказати, наприклад, "\p{In_Arrows}" або "\p{In_Hebrew}".

Для зворотної сумісності префікс "In" можна опустити, якщо немає конфлікту імен
зі сценарієм або будь-якою іншою властивістю, і ви навіть можете використовувати замість них префікс "Є".
випадків. Але не робіть цього для нового коду, тому що ваш код може зламатись у нових випусках, і
це вже траплялося: був час у дуже ранніх випусках Unicode, коли
"\p{Іврит}" відповідав би блок іврит; тепер це не так.

Використання префікса "In" поки що дозволяє уникнути цієї неоднозначності. Але нові версії Unicode продовжують працювати
щоб додати нові властивості, імена яких починаються з "In". Є ймовірність, що один із
колись вони будуть суперечити вашому використанню. Оскільки це лише розширення Perl,
Ім'я Unicode матиме пріоритет, і ваш код буде пошкоджено. Крім того, Unicode є
безкоштовно додати скрипт, ім'я якого починається з "In"; це спричинило б проблеми.

Тож під час вказівки блоків зрозуміліше та найкраще використовувати складену форму. І будьте впевнені
це те, що ти дійсно хочеш зробити. У більшості випадків сценарії - це те, що ви хочете
замість цього.

Повний список блоків і їх ярликів міститься в perluniprops.

Інше властивості

Існує набагато більше властивостей, ніж основні, описані тут. Повний список
знаходиться в perluniprops.

Unicode визначає всі свої властивості у складеній формі, тому всі властивості одноформи є такими
Розширення Perl. Більшість із них є лише синонімами Unicode, але деякі є
справжні розширення, включно з кількома складеними. І чимало
вони насправді рекомендовані Юнікодом (вhttp://www.unicode.org/reports/tr18>).

У цьому розділі наведено деякі відомості про всі розширення, які не є просто синонімами складних
форми властивостей Unicode (для цих властивостей вам доведеться звернутися до Unicode
Стандартнийhttp://www.unicode.org/reports/tr44>.

"\p{Усі}"
Це відповідає всім можливим кодовим точкам. Це еквівалент "qr/./s". На відміну від усіх
інша невизначена користувачем властивість "\p{}" відповідає, попередження ніколи не генерується, якщо це
це властивість зіставляється з кодовою точкою, відмінною від Юнікоду (див. «Поза межами коду Юнікод
пункти" нижче).

"\p{випуск}"
Це відповідає будь-якому символу "\p{Alphabetic}" або "\p{Decimal_Number}".

"\p{Будь-який}"
Це збігається з будь-якою з 1_114_112 кодових точок Unicode. Це синонім слова
"\p{Unicode}".

"\p{ASCII}"
Це збігається з будь-яким із 128 символів у наборі символів US-ASCII, який є a
підмножина Unicode.

"\p{Призначено}"
Це відповідає будь-якій призначеній точці коду; тобто будь-яка кодова точка, загальна категорія якої
не є "Непризначеним" (або, еквівалентно, не "Cn").

"\p{Пустий}"
Це те саме, що "\h" і "\p{HorizSpace}": символ, який змінює інтервал
горизонтально.

"\p{Тип_розкладання: Non_Canonical}" (Коротко: "\p{Dt=NonCanon}")
Відповідає символу, який має неканонічну декомпозицію.

У розділі «Розширені кластери графем (логічні символи)» говорилося вище
канонічні розкладання. Однак багато інших персонажів мають інший тип
декомпозиція, «сумісна» або «неканонічна» декомпозиція. Послідовності, які
формі ці розкладання не вважаються канонічно еквівалентними до
складений характер. Прикладом є "надрядковий індекс один". Це дещо схоже на a
звичайна цифра 1, але не точно; його розкладання на цифру 1 називається а
«сумісне» розкладання, зокрема «супер» розкладання. Є декілька
такі розклади сумісності (дивhttp://www.unicode.org/reports/tr44>),
включно з тим, який називається "compat", що означає різний тип декомпозиції
що не вписується в інші категорії декомпозиції, які вибрав Unicode.

Зауважте, що більшість символів Unicode не мають декомпозиції, тому їх декомпозиція
тип «Немає».

Для вашої зручності Perl додав тип розкладання "Non_Canonical".
будь-який з кількох розкладів сумісності.

"\p{Графік}"
Відповідає будь-якому графічному символу. Теоретично це означає персонаж, який на
принтер спричинив би використання чорнила.

"\p{HorizSpace}"
Це те саме, що "\h" і "\p{Пустий}": символ, який змінює інтервал
горизонтально.

"\p{In=*}"
Це синонім "\p{Present_In=*}"

"\p{PerlSpace}"
Це те саме, що "\s", обмежений ASCII, а саме "[ \f\n\r\t]" і починається в
Perl v5.18, вертикальна вкладка.

Мнемоніка: (оригінальний) простір Perl

"\p{PerlWord}"
Це те саме, що "\w", обмежене ASCII, а саме "[A-Za-z0-9_]"

Мнемоніка: слово Perl (оригінальне).

"\p{Posix...}"
Є кілька таких, які є еквівалентами, використовуючи нотацію "\p{}" для
Класи Posix і описані в розділі «Класи символів POSIX» у perlrecharclass.

"\p{Present_In: *}" (Коротко: "\p{In=*}")
Ця властивість використовується, коли вам потрібно знати, у якій версії (версіях) Unicode є символ.

«*» вище означає деякий двозначний номер версії Unicode, наприклад 1.1 або 4.0; або
"*" також може бути "Не призначено". Ця властивість відповідатиме кодовим точкам
остаточне розпорядження було вирішено з моменту випуску Unicode, наданого версією
число; "\p{Present_In: Unassigned}" відповідатиме тим кодовим точкам, значення яких є
ще не призначено.

Наприклад, «U+0041» «ВЕЛИКА ЛАТИНСЬКА ЛІТЕРА A» була присутня в найпершому Unicode
доступний випуск, який є 1.1, тому ця властивість справедлива для всіх дійсних версій зі знаком «*».
З іншого боку, "U+1EFF" не було призначено до версії 5.1, коли воно стало "LATIN"
МАЛА ЛІТЕРА Y З ПЕТЛЕЮ", тож єдині "*", які відповідатимуть їй, це 5.1, 5.2 та
пізніше.

Юнікод надає властивість "Вік", з якої це походить. Проблема з віком
полягає в тому, що його сувора інтерпретація (яку використовує Perl) відповідає точному
випуск значення кодової точки вводиться. Таким чином, "U+0041" відповідатиме лише 1.1;
і лише "U+1EFF" 5.1. Зазвичай це не те, чого ви хочете.

Деякі реалізації властивості Age, відмінні від Perl, можуть змінити своє значення на
те саме, що властивість Perl "Present_In"; просто знайте це.

Інша плутанина з обома цими властивостями полягає в тому, що визначення не є таким
кодова точка була призначений, але значення кодової точки було
певний. Це пов’язано з тим, що 66 кодових точок завжди будуть непризначеними, і тому
«Вік» для них — це версія Unicode, у якій було прийнято рішення зробити їх такими.
Наприклад, "U+FDD0" має бути остаточно скасовано для персонажа та рішення
це було зроблено у версії 3.1, тому "\p{Age=3.1}" відповідає цьому символу, а також
виконує "\p{Present_In: 3.1}" і вище.

"\p{Друк}"
Це відповідає будь-якому графічному або пустому символу, окрім елементів керування.

"\p{SpacePerl}"
Це те саме, що "\s", включно з ASCII.

Мнемоніка: простір, модифікований Perl. (Він не включає вертикальну вкладку, доки
v5.18, який як стандарт Posix, так і Unicode вважають пробілами.)

"\p{Title}" та "\p{Titlecase}"
У разі відповідності з урахуванням регістру обидва вони відповідають тим самим кодовим точкам, що й "\p{Загальні
Category=Titlecase_Letter}" ("\p{gc=lt}"). Різниця полягає в тому, що під "/i" без регістру
відповідність, вони відповідають так само, як "\p{Cased}", тоді як "\p{gc=lt}" відповідає
"\p{Лист_регістром").

"\p{Unicode}"
Це збігається з будь-якою з 1_114_112 кодових точок Unicode. "\p{Будь-який}".

"\p{VertSpace}"
Це те саме, що "\v": символ, який змінює інтервал по вертикалі.

"\p{Слово}"
Це те саме, що "\w", включаючи понад 100_000 символів поза ASCII.

"\p{XPosix...}"
Є декілька з них, які є стандартними класами Posix, розширеними до повної міри
Діапазон Unicode. Вони описані в розділі «Класи символів POSIX» у perlrecharclass.

Визначений користувачем Характер властивості
Ви можете визначити власні властивості двійкових символів, визначивши підпрограми, імена яких
починаються з "В" або "Є". (Експериментальна функція «(?[ ])» у perlre забезпечує
альтернатива, яка дозволяє більш складні визначення.) Підпрограми можуть бути визначені будь-якими
пакет. Визначені користувачем властивості можна використовувати в регулярному виразі "\p{}" і
"\P{}" конструкції; якщо ви використовуєте властивість, визначену користувачем, із пакета, відмінного від
у якому ви перебуваєте, ви повинні вказати його пакет у конструкції "\p{}" або "\P{}".

# припускаючи властивість Is_Foreign, визначену в Lang::
основний пакет; Потрібна назва пакета # властивості
if ($txt =~ /\p{Lang::IsForeign}+/) { ... }

пакет Lang; Ім'я пакета # властивостей не вимагається
if ($txt =~ /\p{IsForeign}+/) { ... }

Зверніть увагу, що ефект виникає під час компіляції та незмінний після визначення. Проте підпрограми
передається єдиний параметр, який дорівнює 0, якщо діє відповідність з урахуванням регістру, а не
нуль, якщо діє відповідність без регістру. Підпрограма може повертати різні значення
залежно від значення прапора, і один набір значень буде незмінно діяти для
усі збіги з урахуванням регістру, а інший набір для всіх збігів без урахування регістру.

Зауважте, що якщо регулярний вираз зіпсовано, Perl помре, а не викличе
підпрограма, коли ім'я підпрограми визначається зіпсованими даними.

Підпрограми мають повертати спеціально відформатований рядок із одним або кількома символами нового рядка.
розділені лінії. Кожен рядок має бути одним із таких:

· Єдине шістнадцяткове число, що позначає кодову точку для включення.

· Два шістнадцяткові числа, розділені горизонтальними пробілами (пробілом або табличним).
символи), що позначає діапазон кодових точок для включення.

· Щось включити з префіксом "+": вбудована властивість символу (з префіксом
"utf8::") або повний символ (включно з назвою пакета), визначений користувачем
властивість, для представлення всіх символів цієї властивості; два шістнадцяткові коди
бали для діапазону; або одну шістнадцяткову кодову точку.

· Щось, що потрібно виключити, з префіксом "-": наявна властивість символу (з префіксом
"utf8::") або повний символ (включно з назвою пакета), визначений користувачем
властивість, для представлення всіх символів цієї властивості; два шістнадцяткові коди
бали для діапазону; або одну шістнадцяткову кодову точку.

· Щось заперечувати, з префіксом "!": існуюча властивість символу (з префіксом
"utf8::") або повний символ (включно з назвою пакета), визначений користувачем
властивість, для представлення всіх символів цієї властивості; два шістнадцяткові коди
бали для діапазону; або одну шістнадцяткову кодову точку.

· Щось для перетину, з префіксом "&": наявна властивість символу (з префіксом
"utf8::") або повністю кваліфікований (включно з назвою пакета) визначений користувачем символ
властивість, для всіх символів, крім символів у властивості; два
шістнадцяткові кодові точки для діапазону; або одну шістнадцяткову кодову точку.

Наприклад, щоб визначити властивість, яка охоплює обидві японські складові букви (хірагана та
катакана), ви можете визначити

sub InKana {
повернення <
3040\t309F
30A0\t30FF
END
}

Уявіть, що кінцевий маркер here-doc знаходиться на початку рядка. Тепер можна використовувати
"\p{InKana}" та "\P{InKana}".

Ви також могли використати існуючі назви властивостей блоку:

sub InKana {
return <<'END';
+utf8::InHiragana
+utf8::InKatakana
END
}

Припустімо, ви хочете зіставити лише виділені символи, а не необроблені діапазони блоків: in
іншими словами, ви хочете видалити непризначені символи:

sub InKana {
return <<'END';
+utf8::InHiragana
+utf8::InKatakana
-utf8::IsCn
END
}

Заперечення корисне для визначення (сюрприз!) заперечених класів.

sub InNotKana {
return <<'END';
!utf8::InHiragana
-utf8::InKatakana
+utf8::IsCn
END
}

Це збігатиметься з усіма кодовими точками, відмінними від Юнікоду, оскільки кожна з них не в Kana. ви
можна використовувати intersection, щоб виключити їх, якщо потрібно, як показано в цьому модифікованому прикладі:

sub InNotKana {
return <<'END';
!utf8::InHiragana
-utf8::InKatakana
+utf8::IsCn
&utf8::Будь-який
END
}

&utf8::Any має бути останнім рядком у визначенні.

Перетин зазвичай використовується для отримання загальних символів, які відповідають двом (чи більше)
класи. Важливо пам’ятати, що не можна використовувати «&» для першого набору; це було б
перетинається ні з чим, що призводить до порожнього набору.

На відміну від невизначених користувачем властивостей "\p{}", жодне попередження не генерується, якщо ці
властивості зіставляються з кодовою точкою, відмінною від Unicode (див. «Поза кодовими точками Unicode»
нижче).

Визначений користувачем випадок Відображення (Для серйозний хакери тільки)
це особливість має було віддалений as of Perl 5.16. Модуль CPAN "Unicode::Casing" забезпечує
кращу функціональність без недоліків, які мала ця функція. Якщо ви використовуєте Perl
раніше, ніж 5.16, ця функція була найбільш повно задокументована у версії 5.14 цього модуля:
<http://perldoc.perl.org/5.14.0/perlunicode.html#User-Defined-Case-Mappings-%28for-serious-hackers-only%29>

Характер Кодування та цінності вхід та Вихід
Див. Кодування.

Unicode регулярний вираз Підтримка рівень
У наведеному нижче списку підтримуваних Unicode функцій регулярних виразів описано всі
функції, які зараз безпосередньо підтримуються ядром Perl. Посилання на "Рівень N" і
номери розділів стосуються технічного стандарту Unicode №18, «Unicode Regular
Вирази», версія 13, від серпня 2008 року.

· Рівень 1 - базова підтримка Unicode

RL1.1 Hex Notation - done [1]
Властивості RL1.2 - зроблено [2][3]
Властивості сумісності RL1.2a - виконано [4]
RL1.3 Віднімання та перетин - експеримент [5]
RL1.4 Прості межі слів - зроблено [6]
RL1.5 Прості безрезультатні збіги - виконано [7]
Межі лінії RL1.6 - ВІДСУТНІ [8][9]
Точки додаткового коду RL1.7 - зроблено [10]

[1] "\N{U+...}" і "\x{...}"
[2] "\p{...}" "\P{...}"
[3] підтримує не лише мінімальний список, але й усі властивості символів Unicode (див. Unicode
Властивості символу вище)
[4] "\d" "\D" "\s" "\S" "\w" "\W" "\X" "[:опора:]" "[:^prop:]"
[5] Експериментальна функція, починаючи з версії 5.18 "(?[...])", досягає цього.
Дивіться "(?[ ])" у perlre. Якщо ви не хочете використовувати експериментальну функцію, можете
скористайтеся одним із наведених нижче способів.

· Регулярний вираз прогнозування

Ви можете імітувати віднімання класу за допомогою перегляду вперед. Наприклад, що УТС №18
може написати як

[{Block=Грецька}-[{UNASSIGNED}]]

у Perl можна записати так:

(?!\p{Не призначено})\p{Блокувати=Грецька}
(?=\p{Призначено})\p{Блок=Грецька}

Але в цьому конкретному прикладі ви, ймовірно, дійсно хочете

\p{Грецька}

який відповідатиме призначеним символам, які, як відомо, є частиною грецького письма.

· Модуль CPAN "Unicode::Regex::Set"

Він реалізує повне групування, перетин, об’єднання та видалення UTS#18
(віднімання) синтаксис.

· «Визначені користувачем властивості символів»

"+" для об'єднання, "-" для видалення (набір-різниця), "&" для перетину

[6] "\b" "\B"
[7] Зауважте, що Perl виконує повне згортання регістрів у відповідності, а не просте:
Наприклад, "U+1F88" еквівалентно "U+1F00 U+03B9", а не просто "U+1F80".
Ця відмінність має значення головним чином для деяких грецьких великих літер з певними
модифікатори: повний регістр розкладає літеру, тоді як простий регістр-
складання відобразить його на один символ.

[8] Perl розглядає "\n" як роздільник початкового та кінцевого рядків. Unicode визначає більше
символи, які слід так інтерпретувати.
До них відносяться:

VT U+000B (\v в C)
FF U+000C (\f)
CR U+000D (\r)
NEL U+0085
LS U+2028
PS U+2029

"^" і "$" у шаблонах регулярних виразів мають відповідати всім цим, але
не треба. Ці символи також не впливають, але повинні впливати на "<>" $. і рядок сценарію
числа.

Крім того, рядки не повинні бути розділені в межах "CRLF" (тобто між ними немає порожніх рядків
"\r" і "\n"). Для "CRLF" спробуйте шар ":crlf" (див. PerlIO).

[9] Але «Unicode::LineBreak» доступний.
Цей модуль забезпечує розрив рядка відповідно до UAX#14 "Розрив рядка Unicode
Алгоритм"http://www.unicode.org/reports/tr14>.

[10] UTF-8/UTF-EBDDIC, що використовується в Perl, дозволяє не тільки "U+10000" до "U+10FFFF", але також
поза "U+10FFFF"
· Рівень 2 - Розширена підтримка Unicode

Канонічні еквіваленти RL2.1 - ВІДСУТНІ [10][11]
Кластери графем за замовчуванням RL2.2 - ВІДСУТНІ [12]
RL2.3 Межі слів за замовчуванням - ВИКОНАНО [14]
RL2.4 Незмінні збіги за замовчуванням - ВІДСУТНІ [15]
RL2.5 Властивості імен – ГОТОВО
RL2.6 Властивості підстановок - ВІДСУТНІ

[10] див. UAX#15 "Форми нормалізації Unicode"
[11] мають Unicode::Normalize, але не інтегровані в регулярні вирази
[12] мають \X і \b{gcb}, але ми не маємо «кластеру графем»
режим"
[14] див. UAX#29, Межі слів
[15] Це описано в розділі 3.13 (у Unicode 6.0)

· Рівень 3 – Спеціальна підтримка

RL3.1 Спеціальна пунктуація - ВІДСУТНЯ
RL3.2 Спеціалізовані кластери графем - ВІДСУТНІ [17][18]
RL3.3 Спеціальні межі слів - ВІДСУТНІ
RL3.4 Спеціальні вільні сірники - ВІДСУТНІ
RL3.5 Спеціалізовані діапазони - ВІДСУТНІ
RL3.6 Зіставлення контексту - ВІДСУТНИЙ [19]
RL3.7 Додаткові збіги – ВІДСУТНІ
( RL3.8 Unicode Set Sharing )
RL3.9 Можливі набори збігів - ВІДСУТНІ
RL3.10 Складена відповідність - ВІДСУТНІЙ [20]
RL3.11 Субматчі - ВІДСУТНІ

[17] див. UAX#10 «Алгоритми зіставлення Unicode»
[18] мають Unicode::Collate, але не інтегровані в регулярні вирази
[19] мають (?<=x) і (?=x), але виглядають наперед або позаду
має бачити за межами цільового підрядка
[20] потрібна нечутлива відповідність для інших лінгвістичних особливостей
ніж випадок; наприклад, хірагана до катакани, широкий і
вузький, спрощений хань до традиційного хань (див. UTR №30
«Складання персонажів»)

Unicode Кодування
Символи Unicode призначені для код точок, які є абстрактними числами. Для використання цих
чисел, потрібні різні кодування.

· UTF-8

UTF-8 — це кодування змінної довжини (від 1 до 4 байтів), незалежне від порядку байтів. У більшості
документації Perl, включно з іншими частинами цього документа, термін «UTF-8» означає
також "UTF-EBCDIC". Але в цьому розділі «UTF-8» стосується лише кодування, яке використовується на
Платформи ASCII. Це надмножина 7-бітного US-ASCII, тому все, що закодовано в ASCII, має
ідентичне представлення при кодуванні в UTF-8.

Наступна таблиця взята з Unicode 3.2.

Кодові точки 1-й байт 2-й байт 3-й байт 4-й байт

U+0000..U+007F 00..7F
U+0080..U+07FF * C2..DF 80..BF
U+0800..U+0FFF E0 * A0..BF 80..BF
U+1000..U+CFFF E1..EC 80..BF 80..BF
U+D000..U+D7FF ED 80..9F 80..BF
U+D800..U+DFFF +++++ surogates utf16, нелегальний utf8 +++++
U+E000..U+FFFF EE..EF 80..BF 80..BF
U+10000..U+3FFFF F0 * 90..BF 80..BF 80..BF
U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF
U+100000..U+10FFFF F4 80..8F 80..BF 80..BF

Зверніть увагу на пропуски, позначені "*" перед кількома байтовими записами вище. Це
викликано законним UTF-8, що уникає ненайкоротших кодувань: це технічно можливо
UTF-8 кодує одну кодову точку різними способами, але це явно заборонено,
і завжди слід використовувати найкоротше можливе кодування (і саме це робить Perl).

Інший спосіб поглянути на це через біти:

Кодові точки 1-й байт 2-й байт 3-й байт 4-й байт

0ааааааа 0ааааааа
00000bbbbbaaaaaa 110bbbbbb 10aaaaaa
ccccbbbbbbbaaaaaa 1110cccc 10bbbbbb 10aaaaaa
00000dddccccccbbbbbaaaaaa 11110ddd 10cccccc 10bbbbbb 10aaaaaa

Як бачите, всі байти продовження починаються з «10», а початкові біти з
початковий байт вказує, скільки байтів містить закодований символ.

Оригінальна специфікація UTF-8 допускала до 6 байт, щоб дозволити кодування чисел
до "0x7FFF_FFFF". Perl продовжує дозволяти їх і розширив їх до 13
байтів для кодування кодових точок до того, що може вміститися в 64-розрядному слові. Однак Perl буде
попередити, якщо ви виведете будь-який із них як непереносимий; і під суворим введенням UTF-8
протоколи, вони заборонені.

· UTF-EBCDIC

Як UTF-8, але безпечний для EBCDIC, так само як UTF-8 безпечний для ASCII. Це означає, що всі
основні символи (включно з усіма символами, які мають еквіваленти ASCII (наприклад, "A",
"0", "%", і т.п.) однакові як в EBCDIC, так і в UTF-EBCDIC.)

UTF-EBCDIC використовується на платформах EBCDIC. Найбільші кодові точки Unicode займають 5 байтів
для представлення (замість 4 в UTF-8), і Perl розширює його до максимум 7 байтів для
encode pode вказує на те, що може вміститися в 32-розрядному слові (замість 13 байтів і
64-розрядне слово в UTF-8).

· UTF-16, UTF-16BE, UTF-16LE, сурогати та "BOM" (марки порядку байтів)

Наступні пункти призначені переважно для довідки та загального знання Unicode, Perl
не використовує ці конструкції всередині.

Як і UTF-8, UTF-16 є кодуванням змінної ширини, але де UTF-8 використовує 8-бітний код
одиниць, UTF-16 використовує 16-бітні одиниці коду. Усі кодові точки займають 2 або 4 байти
UTF-16: кодові точки "U+0000..U+FFFF" зберігаються в одному 16-бітному блоці, а код
точки "U+10000..U+10FFFF" у двох 16-бітних одиницях. Останній випадок використовує сурогати,
перший 16-розрядний блок є висока сурогатний, а другим є низький
сурогатний.

Сурогати — це кодові точки, виділені для кодування діапазону "U+10000..U+10FFFF"
Кодові точки Unicode в парах 16-бітних одиниць. The висока сурогати є діапазон
"U+D800..U+DBFF" і низький сурогати є діапазоном "U+DC00..U+DFFF". Сурогат
кодування є

$hi = ($uni - 0x10000) / 0x400 + 0xD800;
$lo = ($uni - 0x10000) % 0x400 + 0xDC00;

і розшифровка є

$uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);

Через 16-бітність UTF-16 залежить від порядку байтів. Можна використовувати сам UTF-16
для обчислень у пам’яті, але якщо потрібне зберігання або передача або UTF-16BE
Необхідно вибрати кодування (великий байт) або UTF-16LE (малий байт).

Це створює ще одну проблему: що, якщо ви просто знаєте, що ваші дані UTF-16, але
ви не знаєте, який порядок байтів? Позначки порядку байтів, або "BOM", є рішенням для
це. Спеціальний символ був зарезервований в Юнікоді, щоб функціонувати як порядок байтів
маркер: символ із кодовою точкою "U+FEFF" є "BOM".

Хитрість полягає в тому, що якщо ви читаєте "BOM", ви знатимете порядок байтів, оскільки якби це було
написаний на платформі big-endian, ви прочитаєте байти "0xFE 0xFF", але якщо це було
написаний на платформі little-endian, ви читатимете байти "0xFF 0xFE". (А якщо
початкова платформа записувала в ASCII платформу UTF-8, ви читатимете байти
"0xEF 0xBB 0xBF".)

Цей трюк працює так, що символ із кодовою точкою «U+FFFE» таким не є
має бути у вхідних потоках, тому послідовність байтів "0xFF 0xFE" однозначно
""BOM", представлений у форматі little-endian" і не може бути "U+FFFE", представлений у
формат великого кінця».

Сурогати не мають жодного значення в Unicode, крім їх використання в парах для представлення іншого
кодові точки. Однак Perl дозволяє їх представляти індивідуально всередині, для
наприклад, кажучи "хр(0xD801)", щоб усі кодові точки, а не лише дійсні для
відкрита розв'язка, репрезентативні. Unicode дійсно визначає семантику для них, наприклад
їхня "Загальна_категорія" - "Cs". Але оскільки їх використання є дещо небезпечним, Perl
буде попереджати (використовуючи категорію попередження "сурогат", яка є підкатегорією "utf8")
якщо робиться спроба зробити такі речі, як взяти нижній регістр одного або зіставити регістр-
нечутливо або виводити їх. (Але не пробуйте це на Perls раніше 5.14.)

· UTF-32, UTF-32BE, UTF-32LE

Сімейство UTF-32 дуже схоже на сімейство UTF-16, за винятком одиниць
32-розрядний, тому сурогатна схема не потрібна. UTF-32 має фіксовану ширину
кодування. Сигнатури «BOM»: «0x00 0x00 0xFE 0xFF» для BE та «0xFF 0xFE 0x00»
0x00" для LE.

· UCS-2, UCS-4

Застарілі кодування фіксованої ширини, визначені стандартом ISO 10646. UCS-2 є 16-бітним
кодування. На відміну від UTF-16, UCS-2 не розширюється за межі "U+FFFF", оскільки не
використовувати сурогати. UCS-4 — це 32-розрядне кодування, функціонально ідентичне UTF-32 (
Різниця полягає в тому, що UCS-4 забороняє ані сурогати, ані кодові точки, розмір яких перевищує
"0x10_FFFF").

· UTF-7

Семибітне безпечне (не восьмибітове) кодування, яке корисне під час транспортування чи зберігання
не є восьмибітним безпечним. Визначено RFC 2152.

Неперсонаж код точок
66 кодових точок відведено в Unicode як "несимвольні кодові точки". Усі вони мають
"Непризначений" ("Cn") "Загальна_категорія", і жоден символ ніколи не буде призначений жодному з
їх. Це 32 кодові точки між «U+FDD0» і «U+FDEF» включно та 34
кодові точки:

U+FFFE U+FFFF
U+1FFFE U+1FFFF
U+2FFFE U+2FFFF
...
U+EFFFE U+EFFFF
U+FFFFE U+FFFFF
U+10FFFE U+10FFFF

До Unicode 7.0 несимволи були "заборонений для використання у відкритому обміні
Текстові дані Unicode", щоб код, який обробляв ці потоки, міг використовувати ці кодові точки
як вартові, які можна змішувати з даними символів, і так буде завжди
відрізнити від цих даних. (Додано наголос вище та в наступному абзаці
цей документ.)

Unicode 7.0 змінив формулювання так, що вони "НЕ рекомендований для використання у відкритих
обмін текстовими даними Unicode". Стандарт 7.0 далі говорить:

«Якщо у відкритому обміні отримано несимвол, подавати заявку не потрібно
інтерпретувати це як завгодно. Однак це гарна практика визнавати його як a
несимвол і вжити відповідних дій, наприклад замінити його на "U+FFFD"
символ заміни, щоб позначити проблему в тексті. Не рекомендується
просто видаліть несимвольні кодові точки з такого тексту через потенційну можливість
проблеми безпеки, викликані видаленням неінтерпретованих символів. (Див. положення про відповідність
C7 у Розділі 3.2, Вимоги до відповідності та Технічному звіті Unicode №36,
«Розгляди безпеки Unicode»
<http://www.unicode.org/reports/tr36/#Substituting_for_Ill_Formed_Subsequences>)."

Цю зміну було внесено, оскільки було виявлено, що різні комерційні інструменти, такі як редактори або
для таких речей, як контроль вихідного коду, були написані так, що вони не можуть обробляти
програмні файли, які використовували ці кодові точки, фактично виключаючи їх використання
повністю! І це ніколи не було метою. Вони завжди були призначені для використання всередині
програму або взаємодіючий набір програм за бажанням.

Якщо ви пишете код, наприклад, редактор, який має бути в змозі працювати з будь-яким
Текстові дані Unicode, то вам не слід використовувати ці кодові точки самостійно, а замість них
дозволити їм входити. Якщо вам потрібні вартові, вони повинні бути чимось таким
не є законним Unicode. Для даних UTF-8 ви можете використовувати байти 0xC1 і 0xC2 як сторожові, як
вони ніколи не з’являються у добре сформованому UTF-8. (Існують еквіваленти для UTF-EBCDIC). Ти можеш
також зберігайте свої кодові точки Unicode в цілих змінних і використовуйте від’ємні значення як
вартові.

Якщо ви не пишете такий інструмент, то чи приймаєте ви несимволи як вхідні дані, вирішувати
вас (хоча Стандарт рекомендує не робити цього). Якщо ви виконуєте сувору перевірку вхідного потоку
у Perl ці кодові точки залишаються забороненими. Це для збереження назад
сумісність (інакше можуть відкритися потенційні діри в безпеці, оскільки нічого не підозрює
програма, яка була написана з припущенням, що несимволи будуть відфільтровані раніше
дійшовши до нього, міг зараз, без попередження, почати їх отримувати). Щоб провести сувору перевірку,
ви можете використовувати рівень ":encoding('UTF-8')".

Perl продовжує попереджати (використовуючи категорію попередження "nonchar", яка є підкатегорією
"utf8"), якщо зроблено спробу вивести несимволи.

За Unicode код точок
Максимальна кодова точка Unicode – «U+10FFFF», а Unicode визначає лише операції над кодом
вказує через це. Але Perl працює на кодових точках до максимально допустимого
непідписаний номер, доступний на платформі. Однак Perl не прийматиме їх із вхідних даних
потоки, якщо не використовуються м’які правила, і буде попереджати (використовуючи категорію попередження
"non_unicode", що є підкатегорією "utf8"), якщо такі виводяться.

Оскільки правила Unicode не визначені для цих кодових точок, якщо операція, визначена Unicode
виконується на них, Perl використовує те, що ми вважаємо розумними правилами, хоча загалом попереджаємо,
використовуючи категорію "non_unicode". Наприклад, "uc("\x{11_0000}")" створить такий
попередження, повертаючи вхідний параметр як результат, оскільки Perl визначає верхній регістр
кожна точка коду, відмінного від Unicode, буде самою точкою коду. (Всі регістри змінюються
операції, а не лише верхній регістр, працюють таким чином.)

Ситуація зі збігом властивостей Unicode у регулярних виразах, "\p{}" і
Конструкції "\P{}" проти цих кодових точок не є такими чіткими, як і ці
обробка змінилася, оскільки ми набули досвіду.

Однією з можливостей є розглядати будь-який збіг із цими кодовими точками як невизначений. Але оскільки
Perl не має концепції невизначеного збігу, він перетворює це на помилку або
"ПОМИЛКОВИЙ". Це майже, але не зовсім те, що Perl зробив з версії 5.14 (при використанні цього коду
точки стали загалом надійними) через v5.18. Різниця в тому, що Perl лікувався всім
"\p{}" збігається як невдалий, але всі "\P{}" збігається як успішний.

Одна з проблем полягає в тому, що в деяких випадках це призводить до несподіваних і незрозумілих результатів
випадки:

хр(0x110000) =~ \p{ASCII_Hex_Digit=True} # Помилка <= v5.18
хр(0x110000) =~ \p{ASCII_Hex_Digit=False} # Помилка! на <= v5.18

Тобто він розглядав обидва збіги як невизначені та перетворював їх на false (підвищуючи a
попередження на кожному). Перший випадок — очікуваний результат, а другий — ймовірний
контрінтуїтивне: "Як обидва можуть бути хибними, коли вони доповнюють?" Інша проблема
полягала в тому, що реалізація оптимізувала багато збігів властивостей Юнікоду
існуючі простіші, швидші операції, які не викликають попередження. Ми вирішили не відмовлятися
ті оптимізації, які допомагають переважній більшості збігів, лише для створення попередження
для малоймовірної події, коли порівнюється кодова точка вище Unicode.

У результаті цих проблем, починаючи з версії 5.20, Perl обробляє не-Unicode
кодові точки як типові непризначені символи Unicode, і відповідні відповідності.
(Примітка: Unicode має нетипові непризначені кодові точки. Наприклад, він містить несимвольний код
бали, і ті, які, коли вони будуть призначені, призначені для запису Право на-
зліва, як арабська та іврит. Perl припускає, що жодна кодова точка, відмінна від Unicode, не має жодної
нетипові властивості.)

Perl, у більшості випадків, викличе попередження, коли збігається код вище Unicode
проти властивості Юнікод, коли результат "ІСТИНА" для "\p{}" і "ХИБНІСТЬ" для "\P{}".
Наприклад:

хр(0x110000) =~ \p{ASCII_Hex_Digit=True} # Помилка, без попередження
хр(0x110000) =~ \p{ASCII_Hex_Digit=False} # Успішно, із попередженням

В обох цих прикладах зіставлений символ не є Юнікодом, тому Юнікод не відповідає
визначте, як це має збігатися. Це явно не шістнадцяткова цифра ASCII, тому перший приклад
явно має вийти з ладу, і так воно і відбувається без попередження. Але можна сперечатися, що другий
приклад повинен мати невизначений результат, отже, "ЛОЖНИЙ". Тож за це висувається попередження.

Таким чином, попередження виникає у набагато меншій кількості випадків, ніж у попередніх версіях Perls, і лише тоді, коли що
результат можна сперечатися. Виявляється, жодна з оптимізацій, зроблених Perl
(або коли-небудь, ймовірно, буде зроблено) призводять до пропуску попередження, тому це вирішує обидва
проблеми попереднього підходу Perl. Найбільш часто використовувана властивість, на яку впливає
ця зміна "\p{Непризначений}", що є скороченою формою для
"\p{General_Category=Unassigned}". Починаючи з версії 5.20, усі кодові точки, відмінні від Unicode
вважається «Непризначеним». У попередніх випусках збіги не виконувалися, оскільки результат був
вважається невизначеним.

Єдине місце, де попередження не піднімається, коли воно могло б бути, це якщо
оптимізації призводять до того, що повне збіг шаблону навіть не проводиться. Наприклад, Perl
може визначити, що рядок відповідає певному шаблону регулярного виразу, рядку
має містити підрядок "foobar". Перед спробою збігу Perl може шукати
цей підрядок, і якщо не знайдено, негайно не збігається без фактичної спроби;
тому попередження не генерується, навіть якщо рядок містить кодову точку вище Unicode.

Ця поведінка більшою мірою «роби те, що я маю на увазі», ніж у попередніх версіях Perl для більшості програм. але
він виявляє менше проблем для коду, який має суворо відповідати Unicode. тому
існує додатковий режим роботи, доступний для розміщення такого коду. Цей режим є
увімкнуто, якщо шаблон регулярного виразу скомпільовано в межах лексичної області, де
Клас попередження "non_unicode" став фатальним, наприклад:

використовувати попередження FATAL => "non_unicode"

(див. попередження). У цьому режимі роботи Perl виводить попередження для всіх збігів
проти точки коду, відмінної від Юнікоду (не лише суперечливих), і він пропускає
оптимізації, через які попередження може не виводитися. (Наразі все ще не буде
попередити, якщо збіг навіть не зроблено, як у прикладі "foobar" вище.)

Підводячи підсумок, Perl тепер зазвичай розглядає кодові точки не-Unicode як типові непризначені Unicode
кодові точки для збігів регулярного виразу, викликаючи попередження лише тоді, коли це суперечливо
який має бути результат. Однак, якщо це попередження стало фатальним, це не так
пропущено.

З усього цього є один виняток. "\p{All}" виглядає як властивість Unicode, але це a
Розширення Perl, яке визначено як істинне для всіх можливих кодових точок, Unicode чи ні, отже
жодне попередження ніколи не генерується під час зіставлення цього з кодовою точкою, відмінною від Unicode. (Попередній
до v5.20, це був точний синонім для "\p{Any}", відповідаючи кодовим точкам від 0 до 0x10FFFF.)

Безпека Наслідки of Unicode
Спочатку прочитайте міркування щодо безпеки Unicodehttp://www.unicode.org/reports/tr36>.

Також зверніть увагу на наступне:

· Неправильний формат UTF-8

На жаль, оригінальна специфікація UTF-8 залишає певний простір для інтерпретації
про те, скільки байтів закодованого виводу потрібно згенерувати з одного вхідного Unicode
характер. Строго кажучи, має бути найкоротша послідовність байтів UTF-8
генерується, оскільки інакше існує ймовірність переповнення вхідного буфера на
приймальна сторона підключення UTF-8. Perl завжди генерує UTF-8 найкоротшої довжини,
і з увімкненими попередженнями Perl попереджатиме про ненайкоротшу довжину UTF-8 разом з іншими
вади розвитку, такі як сурогати, які не є дійсними кодовими точками Unicode
обмін.

· Зіставлення шаблону регулярного виразу може вас здивувати, якщо ви до цього не звикли
Unicode. Починаючи з Perl 5.14, кілька модифікаторів шаблонів доступні для керування
це називається модифікатором набору символів. Подробиці наведено в розділі «Набір символів
модифікатори" в perlre.

Як обговорювалося в іншому місці, Perl має одну ногу (два копита?) в кожному з двох світів:
старий світ ASCII та однобайтних локалей, а також новий світ Unicode, оновлений коли
необхідно. Якщо ваш застарілий код явно не використовує Unicode, автоматичного перемикання не буде
в Юнікод має статися.

Unicode in Perl on EBCDIC
Unicode підтримується на платформах EBCDIC. Дивіться perlebcdic.

Якщо конкретно не обговорюються проблеми ASCII проти EBCDIC, посилання на UTF-8
кодування в цьому документі та в інших місцях слід читати як значення UTF-EBCDIC на EBCDIC
платформи. Див. «Юнікод і UTF» у perlebcdic.

Оскільки UTF-EBCDIC дуже схожий на UTF-8, відмінності здебільшого приховані від вас;
"використовувати utf8" (а НЕ щось на зразок "використовувати utfebcdic") заявляє, що сценарій знаходиться в
«рідне» 8-бітне кодування Unicode для платформи. (Так само для шару ":utf8".)

Місцевий
Див. «Юнікод і UTF-8» у perllocale

Коли Unicode Лі Чи не Буває
Є ще багато місць, де Юнікод (у тому чи іншому кодуванні) можна вказати як
аргументи або отримані як результати, або обидва в Perl, але це не так, незважаючи на те, що Perl має
широкі способи введення та виведення в Unicode, а також кілька інших «точок входу», таких як
Масив @ARGV (який іноді можна інтерпретувати як UTF-8).

Нижче наведено такі інтерфейси. Також див. «Помилка Unicode». Для всіх цих
інтерфейси Perl наразі (починаючи з версії 5.16.0) просто приймає байтові рядки як аргументи
і результати, або рядки UTF-8, якщо використовувалася (застаріла) прагма «кодування».

Одна з причин, чому Perl не намагається вирішити роль Юнікоду в таких ситуаціях
полягає в тому, що відповіді сильно залежать від операційної системи та файлової(их) системи(ів).
Наприклад, чи можуть імена файлів бути в Unicode і в якому саме кодуванні
не зовсім портативна концепція. Аналогічно для "qx" і "system": наскільки добре буде
"інтерфейс командного рядка" (і який із них?) обробляє Unicode?

· "chdir", "chmod", "chown", "chroot", "exec", "link", "lstat", "mkdir", "rename",
"rmdir", "stat", "symlink", "truncate", "unlink", "utime", "-X"

· %ENV

· "glob" (він же "<*>")

· "open", "opendir", "sysopen"

· "qx" (він же оператор зворотної галочки), "система"

· "readdir", "readlink"

Команда «Юнікод помилка"
Термін «помилка Unicode» застосовано до невідповідності кодовим точкам у
Блок «Latin-1 Supplement», тобто між 128 і 255. Без вказівки мови,
на відміну від усіх інших символів або кодових точок, ці символи можуть мати дуже різні значення
семантика залежно від діючих правил. (Символи, коди яких вище 255
примусові правила Unicode; тоді як правила для символів ASCII однакові для обох ASCII
і правила Unicode.)

Згідно з правилами Unicode, ці символи верхньої латинської мови1 інтерпретуються як кодові точки Unicode,
це означає, що вони мають таку саму семантику, як елементи керування Latin-1 (ISO-8859-1) і C1.

Як пояснюється в розділі «Правила ASCII проти правил Unicode», вони розглядаються згідно з правилами ASCII
бути непризначеними символами.

Це може призвести до неочікуваних результатів. Наприклад, семантика рядка може раптово
змінити, якщо до нього додається кодова точка вище 255, що змінює правила з ASCII на
Unicode. Як приклад розглянемо наступну програму та її вихід:

$ perl -le'
відсутність функції 'unicode_strings';
$s1 = "\xC2";
$s2 = "\x{2660}";
для ($s1, $s2, $s1.$s2) {
надрукувати /\w/ || 0;
}
'
0
0
1

Якщо ні в "s1", ні в "s2" немає "\w", чому їхнє об'єднання має таке?

Ця аномалія виникає через спробу Perl не заважати старішим програмам, які не використовувалися
Unicode разом із бажанням Perl безперешкодно додати підтримку Unicode. Але результат
виявився не безшовним. (До речі, ви можете отримувати попередження, коли щось подібне
це трапляється. Дивіться "кодування::попередження".)

"використовувати функцію 'unicode_strings'" було додано, починаючи з Perl v5.12, щоб вирішити цю проблему
проблема. Це впливає на такі речі:

· Зміна регістру скаляра, тобто використання "uc()", "ucfirst()", "lc()" і
"lcfirst()" або "\L", "\U", "\u" та "\l" у контекстах із подвійними лапками, наприклад звичайним
заміни виразів.

У розділі "unicode_strings", починаючи з Perl 5.12.0, зазвичай використовуються правила Unicode.
Перегляньте "lc" у perlfunc, щоб дізнатися більше про те, як це працює в поєднанні з іншими
прагми.

· Використання безрегістрового ("/i") зіставлення регулярних виразів.

Починаючи з Perl 5.14.0, регулярні вирази скомпільовані в межах
"unicode_strings" використовують правила Юнікоду навіть під час виконання або компіляції у більший звичайний код
вирази за межами області видимості.

· Зіставлення будь-якої з декількох властивостей у регулярних виразах.

Ці властивості: "\b" (без дужок), "\B" (без дужок), "\s", "\S", "\w",
"\W" і всі класи символів Posix крім "[[:ascii:]]".

Починаючи з Perl 5.14.0, регулярні вирази скомпільовані в межах
"unicode_strings" використовують правила Юнікоду навіть під час виконання або компіляції у більший звичайний код
вирази за межами області видимості.

· У "quotemeta" або його вбудованому еквіваленті "\Q".

Починаючи з Perl 5.16.0, послідовні правила цитування використовуються в межах
"unicode_strings", як описано в "quotemeta" в perlfunc. До цього або поза ним
його область дії, жодні кодові точки вище 127 не беруться в лапки в кодованих рядках UTF-8, але в байтах
закодовані рядки, кодові точки між 128-255 завжди беруться в лапки.

Ви можете бачити з наведеного вище, що ефект "unicode_strings" збільшився протягом кількох
Релізи Perl. (Підтримка Unicode в Perl продовжує вдосконалюватися; найкраще використовувати
останній доступний випуск, щоб отримати максимально повні та точні результати.)
Зауважте, що "unicode_strings" вибирається автоматично, якщо ви "використовуєте 5.012" або вище.

Для Perl раніше, ніж описано вище, або коли рядок передається функції
поза межами "unicode_strings", див. наступний розділ.

Примус Unicode in Perl (Ор Звільнення Unicode in Perl)
Іноді (див. «Коли Unicode не працює» або «Помилка Unicode») виникають ситуації
де вам просто потрібно примусово перевести рядок байтів у UTF-8 або навпаки. Стандарт
Для цього можна використовувати модуль Encode або низькорівневі виклики "utf8::upgrade($bytestring)"
і "utf8::downgrade($utf8string[, FAIL_OK])".

Зауважте, що «utf8::downgrade()» може завершитися помилкою, якщо рядок містить символи, які не підходять
в байт.

Виклик будь-якої функції для рядка, який уже знаходиться в потрібному стані, є безопераційним.

«Правила ASCII проти правил Unicode» містить усі способи створення рядка для використання Unicode
правила.

використання Unicode in XS
Перегляньте розділ «Підтримка Unicode» у perlguts, щоб ознайомитися з Unicode на рівні XS, а також
«Підтримка Unicode» в perlapi для деталей API.

Злом Perl до робота on раніше Unicode версії (Для дуже серйозний хакери тільки)
Perl за замовчуванням постачається з вбудованою останньою підтримуваною версією Unicode, але мета така
щоб дозволити вам змінити будь-який попередній. Однак у Perls v5.20 і v5.22
найранішою доступною версією є Unicode 5.1. Perl v5.18 здатний обробляти все раніше
версій.

Завантажте файли в потрібній версії Unicode з веб-сайту Unicode
<http://www.unicode.org>). Вони повинні замінити наявні файли в lib/unicore в
Дерево джерел Perl. Дотримуйтесь інструкцій у README.perl у цьому каталозі, щоб змінити деякі
їхніх імен, а потім створіть perl (див. ВСТАНОВЛЕННЯ).

Перенесення код від perl-5.6.X
Perls, починаючи з версії 5.8, має іншу модель Unicode від версії 5.6. В 5.6 програматор був
потрібно використовувати прагму "utf8", щоб оголосити, що дана область має працювати
Дані Unicode і повинні були переконатися, що лише дані Unicode досягають цього обсягу. Якщо ви
мати код, який працює з 5.6, вам знадобляться деякі з наведених нижче налаштувань
ваш код. Приклади написані так, що код продовжуватиме працювати під 5.6, отже
ви повинні бути безпечними, щоб спробувати їх.

· Дескриптор файлу, який повинен читати або записувати UTF-8

якщо ($] > 5.008) {
binmode $fh, ":кодування(utf8)";
}

· Скаляр, який буде передано до деякого розширення

Будь то "Compress::Zlib", "Apache::Request" або будь-яке розширення, у якому не згадується
Unicode на сторінці довідки, вам потрібно переконатися, що прапор UTF8 видалено. Примітка
що на момент написання цієї статті (січень 2012 р.) згадані модулі відсутні
з підтримкою UTF-8. Будь ласка, перевірте документацію, щоб переконатися, що це все ще правда.

якщо ($] > 5.008) {
вимагати кодування;
$val = Encode::encode_utf8($val); # створити октети
}

· Скаляр, який ми повернули з розширення

Якщо ви вважаєте, що скаляр повертається як UTF-8, вам, швидше за все, знадобиться прапор UTF8
відновлено:

якщо ($] > 5.008) {
вимагати кодування;
$val = Encode::decode_utf8($val);
}

· Те саме, якщо ви дійсно впевнені, що це UTF-8

якщо ($] > 5.008) {
вимагати кодування;
Encode::_utf8_on($val);
}

· Обгортка для DBI "fetchrow_array" і "fetchrow_hashref"

Якщо база даних містить лише UTF-8, функція або метод оболонки є зручним способом
щоб замінити всі ваші виклики "fetchrow_array" і "fetchrow_hashref". Функція обгортки
також полегшить адаптацію до майбутніх удосконалень драйвера бази даних. Примітка
що на момент написання цієї статті (січень 2012 р.) DBI не має стандартизованого способу
працювати з даними UTF-8. Будь ласка, перевірте документацію DBI, щоб переконатися, що це все ще
правда.

sub fetchrow {
# $що таке fetchrow_{array,hashref}
my($self, $sth, $what) = @_;
якщо ($] < 5.008) {
повернути $sth->$what;
} Ще {
вимагати кодування;
if (wantarray) {
мій @arr = $sth->$what;
для (@arr) {
визначено && /[^\000-\177]/ && Encode::_utf8_on($_);
}
повернути @arr;
} Ще {
мій $ret = $sth->$what;
if (ref $ret) {
для мого $k (ключі %$ret) {
певний
&& /[^\000-\177]/
&& Encode::_utf8_on($_) для $ret->{$k};
}
повернути $ret;
} Ще {
визначено && /[^\000-\177]/ && Encode::_utf8_on($_) для $ret;
повернути $ret;
}
}
}
}

· Великий скаляр, який, як ви знаєте, може містити лише ASCII

Скаляри, які містять лише ASCII і позначені як UTF-8, іноді ускладнюють ваші дії
програма. Якщо ви розпізнаєте таку ситуацію, просто видаліть прапор UTF8:

utf8::downgrade($val), якщо $] > 5.008;

Використовуйте perlunicode онлайн за допомогою сервісів onworks.net


Безкоштовні сервери та робочі станції

Завантажте програми для Windows і Linux

  • 1
    unitedrpms
    unitedrpms
    Приєднуйтесь до нас у Gitter!
    https://gitter.im/unitedrpms-people/Lobby
    Увімкніть репозиторій URPMS у вашому
    система -
    https://github.com/UnitedRPMs/unitedrpms.github.io/bl...
    Завантажити unitedrpms
  • 2
    Збільшити C ++ Бібліотеки
    Збільшити C ++ Бібліотеки
    Boost надає безкоштовний портативний пристрій
    рецензовані бібліотеки C++. The
    акцент робиться на переносних бібліотеках, які
    добре працювати зі стандартною бібліотекою C++.
    Перегляньте http://www.bo...
    Завантажте бібліотеки Boost C++
  • 3
    VirtualGL
    VirtualGL
    VirtualGL перенаправляє тривимірні команди з a
    Програма OpenGL Unix/Linux на a
    серверний графічний процесор і перетворює
    відтворювати 3D-зображення у відеопотік
    з якої ...
    Завантажити VirtualGL
  • 4
    libusb
    libusb
    Бібліотека, щоб увімкнути простір користувача
    прикладні програми для спілкування
    USB-пристрої. Аудиторія: розробники, кінець
    Користувачі / Робочий стіл. Мова програмування: C.
    Категорії...
    Завантажити libusb
  • 5
    ЛАГІТ
    ЛАГІТ
    SWIG – це інструмент розробки програмного забезпечення
    що з'єднує програми, написані на C і
    C++ з різноманітними високорівневими
    мови програмування. SWIG використовується з
    інший...
    Завантажити SWIG
  • 6
    Тема WooCommerce Nextjs React
    Тема WooCommerce Nextjs React
    Тема React WooCommerce, створена за допомогою
    Next JS, Webpack, Babel, Node і
    Express, використовуючи GraphQL і Apollo
    Клієнт. Магазин WooCommerce в React(
    містить: Продукти...
    Завантажте тему WooCommerce Nextjs React
  • Детальніше »

Команди Linux

Ad