АнглийскийФранцузскийИспанский

Значок OnWorks

perllocale - Интернет в облаке

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

Это команда perllocale, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

ПРОГРАММА:

ИМЯ


perllocale - обработка локали Perl (интернационализация и локализация)

ОПИСАНИЕ


Вначале был ASCII, «Американский стандартный код информации.
Обмен », который хорошо работает для американцев с их английским алфавитом и долларом.
деноминированная валюта. Но это не так хорошо даже для других носителей английского языка, которые
могут использовать разные валюты, например фунт стерлингов (в качестве символа этой валюты
не в ASCII); и это безнадежно неадекватно для многих тысяч людей в мире
Другие языки.

Для устранения этих недостатков была изобретена концепция локалей (формально ISO C,
XPG4, POSIX 1.c «региональная система»). И были и пишутся приложения, использующие
механизм локали. В процессе подачи такой заявки учитываются ее
предпочтения пользователей в подобных вопросах называется интернационализация (довольно часто
сокращенно как i18n); сообщить такому приложению о конкретном наборе предпочтений - это
известный как локализация (l10n).

Perl был расширен для поддержки системы языковых стандартов. Это контролируется для каждого приложения
используя одну директиву, один вызов функции и несколько переменных среды.

К сожалению, в дизайне есть немало недостатков (и часто
реализации) локалей. Был изобретен Юникод (см. Perlunitut для введения в
что) частично для устранения этих недостатков конструкции, и в настоящее время существует ряд
«Локали UTF-8», основанные на Unicode. Это локали с набором символов Unicode,
в кодировке UTF-8. Начиная с v5.20, Perl полностью поддерживает локали UTF-8, за исключением
сортировка и сравнение строк. (Для этого используйте Unicode :: Collate.) Perl продолжает
также поддерживают старые локали, отличные от UTF-8. В настоящее время нет локалей UTF-8 для
Платформы EBCDIC.

(Unicode также создает «CLDR», «Репозиторий данных общего языка»,
<http://cldr.unicode.org/> который включает больше типов информации, чем доступно в
система языковых стандартов POSIX. На момент написания не было модуля CPAN, который
обеспечивает доступ к этим данным в кодировке XML. Однако во многих его регионах есть POSIX-
только извлеченные данные и доступны как языковые стандарты UTF-8 по адресу
<http://unicode.org/Public/cldr/latest/>.)

ЧТО IS A МЕСТО


Локаль - это набор данных, описывающих различные аспекты того, как различные сообщества в
мир категоризируют свой мир. Эти категории делятся на следующие типы
(некоторые из них включают здесь краткое примечание):

Категория "LC_NUMERIC": числовое форматирование.
Это указывает, как числа должны быть отформатированы для удобства чтения, например
символ, используемый как десятичная точка.

Категория "LC_MONETARY": форматирование денежных сумм

Категория "LC_TIME": форматирование даты и времени.

Категория "LC_MESSAGES": сообщения об ошибках и другие сообщения.
Это используется самим Perl только для доступа к сообщениям об ошибках операционной системы через $!
и $ ^ E.

Категория "LC_COLLATE": сопоставление
Это указывает на порядок букв для сравнения и сортировки. На латыни
алфавиты, например, «b», обычно следует за «a».

Категория "LC_CTYPE": типы символов
Это указывает, например, является ли символ прописной буквой.

Другие категории
На некоторых платформах есть другие категории, связанные с такими вещами, как единицы измерения.
и форматы бумаги. Ни один из них не используется Perl напрямую, кроме операций, которые
Perl может их использовать. См. «Не в рамках« использовать языковой стандарт »» ниже.

Более подробная информация о категориях, используемых Perl, приведена ниже в разделе «ЛОКАЛЬНЫЕ КАТЕГОРИИ».

Вместе эти категории имеют большое значение для настройки единой программы.
бегать по разным локациям. Но есть недостатки, так что продолжайте читать.

ПОДГОТОВКА К ИСПОЛЬЗОВАНИЕ LOCAL


Сам Perl (вне модуля POSIX) не будет использовать локали, если специально не запрошено
в (но опять же обратите внимание, что Perl может взаимодействовать с кодом, который их использует). Даже если есть
такой запрос, ВСЕ для правильной работы должны выполняться следующие условия:

· ВАШЕ операционный система должен поддержка местный система. Если это так, вы должны найти
что функция "setlocale ()" является документированной частью ее библиотеки C.

· Определения для местный который использование должен be установлен. Вы или ваша система
администратор, должен убедиться, что это так. Доступные регионы,
место, в котором они хранятся, и способ их установки различаются
от системы к системе. Некоторые системы предоставляют только несколько жестко подключенных локалей и не
позвольте добавить больше. Другие позволяют добавлять "стандартные" языковые стандарты, предоставляемые
системный поставщик. Третьи позволяют вам или системному администратору определять и добавлять
произвольные локации. (Возможно, вам придется попросить своего поставщика предоставить консервированные локали,
не поставляются с вашей операционной системой.) Прочтите системную документацию для
дальнейшее освещение.

· Perl должен верить который местный система is поддержал. Если это так, "perl
-V: d_setlocale "скажет, что значение для" d_setlocale "-" определить ".

Если вы хотите, чтобы приложение Perl обрабатывало и представляло ваши данные в соответствии с определенным
языковой стандарт, код приложения должен включать прагму «использовать языковой стандарт» (см. «Использование языкового стандарта»
pragma "), где это необходимо, и at наименее one из следующего должно быть правдой:

1. Команда определение локали охрана окружающей среды переменные (См. "ОКРУЖАЮЩАЯ ОБСТАНОВКА") должен be правильно набор
up в момент запуска приложения, либо вами, либо кем-либо, кто настроил
ваша системная учетная запись; или

2. Команда приложению должен набор его собственный местный используя метод, описанный в разделе «Setlocale
функция ".

С ПОМОЩЬЮ LOCAL


Команда "использовать locale " прагма
По умолчанию сам Perl (вне модуля POSIX) игнорирует текущую локаль. В
Прагма "use locale" указывает Perl использовать текущую локаль для некоторых операций. Начиная с
v5.16, в этой прагме есть необязательные параметры, описанные ниже, которые ограничивают
это влияет на операции.

Текущий языковой стандарт устанавливается во время выполнения с помощью setlocale () описано ниже. Если это
функция еще не была вызвана в процессе выполнения программы, текущий
locale - это то, что было определено "ОКРУЖАЮЩЕЙ СРЕДОЙ", действовавшей в начале
программа. Если допустимая среда отсутствует, текущая локаль - это любая система.
по умолчанию установлено значение. В системах POSIX вероятно, но не обязательно, буква "C"
локаль. В Windows значение по умолчанию устанавливается через компьютерную
«Панель управления-> Язык и региональные стандарты» (или его текущий эквивалент).

Локаль влияет на следующие операции:

Не одной сфера of "использовать locale "
Только определенные операции, происходящие за пределами Perl, должны быть затронуты, а именно:

· Текущая локаль используется при выходе из Perl с такими операциями, как
система() или qx //, если эти операции зависят от языкового стандарта.

· Также Perl предоставляет доступ к различным функциям библиотеки C через модуль POSIX.
На некоторые из этих функций всегда влияет текущий языковой стандарт. Например,
«POSIX :: strftime ()» использует «LC_TIME»; «POSIX :: strtod ()» использует «LC_NUMERIC»;
«POSIX :: strcoll ()» и «POSIX :: strxfrm ()» используют «LC_COLLATE»; и характер
функции классификации, такие как «POSIX :: isalnum ()», используют «LC_CTYPE». Все такие
функции будут вести себя в соответствии с текущим базовым языковым стандартом, даже если это
locale не отображается в пространстве Perl.

· Модули XS для всех категорий, кроме "LC_NUMERIC", получают базовый языковой стандарт и
следовательно, любые функции библиотеки C, которые они вызывают, будут использовать эту базовую локаль. Для большего
обсуждение, см. "ПРОГНОЗЫ" в perlxs.

Обратите внимание, что все программы на C (включая интерпретатор perl, написанный на C)
всегда есть базовый языковой стандарт. Этим языковым стандартом является языковой стандарт "C", если он не изменен
позвонить setlocale (). Когда Perl запускается, он меняет базовый языковой стандарт на
что обозначается надписью «ОКРУЖАЮЩАЯ СРЕДА». При использовании модуля POSIX или написании XS
кода, важно иметь в виду, что базовая локаль может быть чем-то
кроме "C", даже если программа не изменила его явно.

затяжной эффекты of "использовать locale "
Определенные операции Perl, настроенные в рамках «использования локали», сохраняют это
эффект даже за рамками. К ним относятся:

· Формат вывода записывать() определяется более ранним объявлением формата
("формат" в perlfunc), поэтому зависит от языкового стандарта на вывод.
определяется тем, находится ли «format ()» в пределах «локали использования», а не тем,
"write ()" есть.

· Шаблоны регулярных выражений могут быть скомпилированы с использованием qr // с фактическим соответствием
отложено на потом. Опять же, это то, была ли компиляция сделана в
область "использования локали", которая определяет поведение соответствия, а не соответствие
делаются в таком объеме или нет.

Под ""использовать locale ";"
· Все вышеперечисленные операции

· Формат Заявления ("формат" в perlfunc) и, следовательно, любое последующее использование "write ()"
«LC_NUMERIC».

· стрингификация и выходной используйте "LC_NUMERIC". К ним относятся результаты
print (), printf (), say () и sprintf ().

· Команда сравнение Операторы («lt», «le», «cmp», «ge» и «gt») используйте «LC_COLLATE».
"sort ()" также влияет, если используется без явной функции сравнения, потому что
по умолчанию он использует cmp.

Примечание: "eq" и "ne" не зависят от языкового стандарта: они всегда выполняются по символам
сравнение их скалярных операндов. Более того, если "cmp" обнаружит, что его
операнды равны в соответствии с последовательностью сопоставления, заданной текущим
locale, он выполняет поэтапное сравнение и возвращает только 0
(равно), если операнды идентичны символам символов. Если ты действительно хочешь знать
равны ли две строки - которые "eq" и "cmp" могут считаться разными - равны
что касается сопоставления в локали, см. обсуждение в разделе «Категория
"LC_COLLATE": сопоставление ".

· Стандарт выражения и модификация корпуса Функции («uc ()», «lc ()», «ucfirst ()»,
и "lcfirst ()") используют "LC_CTYPE"

· Команда переменные $! (и его синонимы $ ERRNO и $ OS_ERROR) и $ ^ E (и его синоним
$ EXTENDED_OS_ERROR) при использовании в качестве строк используйте "LC_MESSAGES".

Поведение по умолчанию восстанавливается с помощью прагмы "no locale" или по достижении конца
блок, включающий «использовать локаль». Обратите внимание, что вызовы "использовать локаль" могут быть вложенными, и что
то, что действует во внутренней области, в конце вернется к правилам внешней области
внутренней области.

Строковый результат любой операции, использующей информацию о локали, испорчен, так как
возможно, что регион не заслуживает доверия. См. «БЕЗОПАСНОСТЬ».

Начиная с Perl v5.16 очень ограниченным способом, и в более общем плане с v5.22, вы можете
ограничить, какие категории или категории включены в этом конкретном экземпляре
pragma, добавив к нему параметры. Например,

использовать локаль qw (: ctype: numeric);

обеспечивает осведомленность о локали в пределах своей области только для тех операций (перечисленных выше), которые
затронуты "LC_CTYPE" и "LC_NUMERIC".

Возможные категории: ": сопоставление", ": ctype", ": сообщения", ": денежное", ": числовое",
": time" и псевдокатегория ": characters" (описана ниже).

Таким образом вы можете сказать

используйте locale ': messages';

и только $! и $ ^ E будет знать локаль. На все остальное это не влияет.

Поскольку Perl в настоящее время ничего не делает с категорией "LC_MONETARY", указав
": monetary" практически ничего не делает. В некоторых системах есть другие категории, например
"LC_PAPER_SIZE", но Perl также ничего о них не знает, и нет возможности
укажите их в аргументах этой прагмы.

Вы также можете легко сказать использовать все категории, кроме одной, например,

используйте locale ':! ctype';
используйте локаль ': not_ctype';

и то, и другое означают включение знания локали для всех категорий, кроме "LC_CTYPE". Только один
Аргумент категории может быть указан в «локали использования», если он имеет отрицательную форму.

До v5.22 была доступна только одна форма прагмы с аргументами:

используйте локаль ': not_characters';

(и вы должны сказать «not_»; вы не можете использовать форму bang «!»). Эта псевдокатегория является
сокращение для указания как ": collate", так и ": ctype". Следовательно, в отрицательной форме это
почти то же самое, что сказать

использовать локаль qw (: сообщения: денежные: числовые: время);

Мы используем термин "почти", потому что ": not_characters" также включает
"использовать функцию" unicode_strings "" в пределах своей области. Эта форма менее полезна в v5.20 и
позже и полностью описан в «Unicode и UTF-8», но вкратце он говорит Perl не
используйте части символов определения локали, то есть "LC_CTYPE" и
Категории "LC_COLLATE". Вместо этого он будет использовать собственный набор символов (расширенный на
Юникод). При использовании этого параметра вы несете ответственность за получение внешнего
набор символов переведен в собственный код / ​​Unicode (который уже будет, если он
одна из наиболее популярных локалей UTF-8). Есть удобные способы сделать это,
как описано в «Юникод и UTF-8».

Команда установить локаль функция
Вы можете переключать языковые стандарты так часто, как хотите, во время выполнения с помощью «POSIX :: setlocale ()»
функция:

# Импортировать набор инструментов для обработки локали из модуля POSIX.
# В этом примере используется: setlocale - вызов функции
# LC_CTYPE - объяснено ниже
# (Показывает, что проверка на успешность / неудачу операций
# в этих примерах опущено, чтобы не отвлекаться от основного
# точка)

используйте POSIX qw (locale_h);
использовать локаль;
мой $ old_locale;

# запросить и сохранить старую локаль
$ old_locale = setlocale (LC_CTYPE);

setlocale (LC_CTYPE, "fr_CA.ISO8859-1");
# LC_CTYPE теперь в языковом стандарте "Французский, Канада, кодировка ISO 8859-1"

setlocale (LC_CTYPE, "");
# LC_CTYPE теперь сброшен на значение по умолчанию, определенное
# Переменные среды LC_ALL / LC_CTYPE / LANG или в систему
# дефолт. См. Документацию ниже.

# восстановить старую локаль
setlocale (LC_CTYPE, $ old_locale);

Это одновременно влияет на все потоки программы, поэтому использовать
языковые стандарты в многопоточных приложениях, за исключением случаев, когда существует один языковой стандарт, применимый ко всем
потоки.

Первый аргумент setlocale () дает Каталогвторая местный,
Категория указывает, в каком аспекте обработки данных вы хотите применить правила, зависящие от локали.
Названия категорий обсуждаются в разделах «МЕСТНЫЕ КАТЕГОРИИ» и «ОКРУЖАЮЩАЯ СРЕДА». Регион - это
имя набора информации о настройке, соответствующей конкретному
сочетание языка, страны или территории и кодового набора. Читайте советы по
именование локалей: не все системы называют локали, как в примере.

Если второй аргумент не указан и категория отличается от "LC_ALL",
Функция возвращает строку с указанием текущего языкового стандарта для категории. Вы можете использовать это
значение в качестве второго аргумента в последующем вызове "setlocale ()", но на некоторых платформах
строка непрозрачна, и большинство людей не сможет понять, что именно
локаль это значит.

Если второй аргумент не указан, а категория - «LC_ALL», результатом будет
зависит от реализации. Это может быть строка объединенных имен локалей (разделитель также
зависит от реализации) или одного имени локали. Проконсультируйтесь со своим установить локаль(3) мужчина
страницы для деталей.

Если указан второй аргумент и он соответствует допустимому языку, языковой стандарт для
category устанавливается на это значение, и функция возвращает текущее значение локали. Ты
затем можно использовать это в еще одном вызове "setlocale ()". (В некоторых реализациях
возвращаемое значение может иногда отличаться от значения, которое вы указали в качестве второго аргумента - подумайте о
это как псевдоним для значения, которое вы дали.)

Как показывает пример, если второй аргумент - пустая строка, локаль категории будет
вернулся к значению по умолчанию, указанному соответствующими переменными среды. В целом,
это приводит к возврату к значению по умолчанию, которое было в силе при запуске Perl: изменяется на
среда, созданная приложением после запуска, может быть замечена или не замечена, в зависимости от
в библиотеке C.

Обратите внимание, что когда указана форма «использовать языковой стандарт», которая не включает все категории,
Perl игнорирует исключенные категории.

Если "set_locale ()" не работает по какой-либо причине (например, при попытке установить языковой стандарт
неизвестен системе), локаль для категории не меняется, а функция
возвращает undef.

Для получения дополнительной информации о категориях см. установить локаль(3).

Обнаружение местный
Информацию о регионах, доступных в вашей системе, см. Также установить локаль(3) посмотреть, приводит ли это к
список доступных языков (ищите СМ ТАКЖЕ раздел). Если это не поможет, попробуйте
следующие командные строки:

locale -a

нлсинформация

ls / usr / lib / nls / loc

ls / usr / lib / locale

ls / usr / lib / nls

ls / usr / share / locale

и посмотрите, перечисляют ли они что-то похожее на эти

en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
en_US.iso88591 de_DE.iso88591 ru_RU.iso88595
en_US de_DE ru_RU
ан де ру
английский немецкий русский
английский.iso88591 немецкий.iso88591 русский.iso88595
английский.roman8 русский.koi8r

К сожалению, хотя вызывающий интерфейс для "setlocale ()" стандартизирован, имена
locales и каталоги, в которых находится конфигурация, не были. Основная форма
имени язык_территория.набор кодов, но последние части после язык не
всегда присутствует. В язык и страна обычно из стандартов ISO 3166 и ISO
639, двухбуквенные сокращения для стран и языков мира,
соответственно. набор кодов часть часто упоминает некоторые ISO 8859 набор символов, латиница
кодовые наборы. Например, «ISO 8859-1» - это так называемый «западноевропейский кодовый набор», который может
использоваться для адекватного кодирования большинства западноевропейских языков. Опять же, есть несколько
способы написать даже название того единственного стандарта. К сожалению.

Особого внимания заслуживают две специальные локали: «C» и «POSIX». В настоящее время это
фактически тот же языковой стандарт: разница в основном в том, что первый определяется
Стандарт C, второй по стандарту POSIX. Они определяют по умолчанию местный , в которой
каждая программа запускается при отсутствии информации о локали в ее среде. (В
по умолчанию языковой стандарт по умолчанию, если хотите.) Его язык - (американский) английский, а его
набор символов ASCII или, в редких случаях, его надмножество (например, "DEC Multinational
Набор символов (DEC-MCS) »). Предупреждение. Локаль C, поставляемая некоторыми поставщиками, может не
фактически точно соответствует тому, что требует стандарт C. Так что будьте осторожны.

ЗАМЕТКА: Не все системы имеют локаль "POSIX" (не все системы совместимы с POSIX), поэтому
используйте «C», когда вам нужно явно указать этот языковой стандарт по умолчанию.

МЕСТО ПРОБЛЕМЫ
При запуске Perl вы можете увидеть следующее предупреждающее сообщение:

perl: предупреждение: не удалось установить языковой стандарт.
perl: warning: проверьте, что ваши настройки локали:
LC_ALL = "En_US",
LANG = (не задано)
поддерживаются и устанавливаются в вашей системе.
perl: предупреждение: возврат к стандартному языку ("C").

Это означает, что в настройках вашей локали "LC_ALL" установлен на "En_US", а LANG существует, но имеет
неважно. Перл пытался вам поверить, но не смог. Вместо этого Perl сдался и отступил
к языку "C", языку по умолчанию, который должен работать несмотря ни на что. (На
Windows сначала пытается вернуться к языку системы по умолчанию.) Обычно это означает
ваши настройки локали были неправильными, в них упоминаются локали, о которых ваша система никогда не слышала, или
при установке локали в вашей системе возникли проблемы (например, некоторые системные файлы
сломан или отсутствует). Есть быстрые и временные решения этих проблем, а также
более тщательные и долговечные исправления.

Тестирование для сломанный местный
Если вы собираете Perl из исходного кода, файл набора тестов Perl библиотека / locale.t может быть использован для
протестируйте локали в вашей системе. Установка переменной среды «PERL_DEBUG_FULL_TEST»
значение 1 приведет к выдаче подробных результатов. Например, в Linux вы можете сказать

PERL_DEBUG_FULL_TEST = 1 ./perl -T -Ilib lib / locale.t> locale.log 2> & 1

Помимо множества других тестов, он проверит каждую локаль, которую найдет в вашей системе, чтобы убедиться, что они
соответствуют стандарту POSIX. Если есть ошибки, в конце будет указано краткое изложение.
вывода, какие языковые стандарты прошли все тесты, а какие - нет, и почему.

Временно фиксация местный проблемам
Два самых быстрых исправления - либо заставить Perl замолчать о любых несоответствиях языкового стандарта.
или запустить Perl с локалью по умолчанию "C".

Стоны Perl о проблемах с локализацией можно заглушить, установив переменную окружения
«PERL_BADLANG» на «0» или «». Этот метод действительно просто скрывает проблему:
вы говорите Perl замолчать, даже если Perl видит, что что-то не так. Не удивляйтесь
если позже что-то зависящее от локали ведет себя некорректно.

Perl можно запустить в локали «C», установив для переменной среды «LC_ALL» значение «C».
Этот метод, возможно, немного более цивилизованный, чем подход "PERL_BADLANG", но установка
«LC_ALL» (или другие переменные языкового стандарта) также могут влиять на другие программы, а не только на Perl. В
в частности, внешние программы, запущенные из Perl, увидят эти изменения. Если вы сделаете
новые настройки постоянны (читайте дальше), все программы, которые вы запускаете, видят изменения. Видеть
«ОКРУЖЕНИЕ» для полного списка соответствующих переменных среды и «ИСПОЛЬЗОВАНИЕ МЕСТ» для
их эффекты в Perl. Эффекты в других программах легко вывести. Например,
переменная "LC_COLLATE" вполне может повлиять на ваш sort программа (или любая другая программа,
расставляет "записи" по алфавиту в вашей системе называется).

Вы можете проверить временное изменение этих переменных, и если новые настройки кажутся
help, поместите эти настройки в файлы запуска оболочки. Проконсультируйтесь с местной документацией
для точных деталей. Для борноподобных снарядов (sh, КШ, колотить, ЗШ):

LC_ALL = en_US.ISO8859-1
экспорт LC_ALL

Это предполагает, что мы видели локаль "en_US.ISO8859-1" с помощью команд, описанных выше.
Мы решили попробовать, что вместо указанной выше неисправной локали "En_US" - и в оболочках Cshish
(CSH, Tcsh)

setenv LC_ALL en_US.ISO8859-1

или если у вас есть приложение "env", вы можете сделать это (в любой оболочке)

env LC_ALL = en_US.ISO8859-1 perl ...

Если вы не знаете, какая у вас оболочка, обратитесь в местную службу поддержки или аналогичную.

Постоянно фиксация местный проблемам
Более медленные, но лучшие исправления - это когда вы можете сами исправить
неправильная конфигурация ваших собственных переменных среды. Конфигурация mis (sing)
Локаль всей системы обычно требует помощи вашего дружелюбного системного администратора.

Во-первых, см. Ранее в этом документе о «Поиске локалей». Это говорит о том, как найти
локали действительно поддерживаются - и, что более важно, устанавливаются - в вашей системе. В нашем
пример сообщения об ошибке, переменные среды, влияющие на локаль, перечислены в порядке
уменьшающейся важности (и неустановленные переменные значения не имеют). Следовательно, имея LC_ALL
установка на "En_US", должно быть, была неудачным выбором, как показано в сообщении об ошибке. Первая попытка
исправление настроек локали, указанных первым.

Во-вторых, при использовании перечисленных команд вы видите что-то точно, (совпадения префиксов не
count и case обычно считается) как "En_US" без кавычек, тогда все должно быть в порядке
потому что вы используете имя локали, которое должно быть установлено и доступно в вашей системе.
В этом случае см. «Постоянное исправление конфигурации локали вашей системы».

Постоянно фиксация системы местный конфигурация
Это когда вы видите что-то вроде:

perl: warning: проверьте, что ваши настройки локали:
LC_ALL = "En_US",
LANG = (не задано)
поддерживаются и устанавливаются в вашей системе.

но затем не может увидеть, что "En_US" перечислен вышеупомянутыми командами. Вы можете увидеть
такие вещи, как "en_US.ISO8859-1", но это не то же самое. В этом случае попробуйте запустить
языковой стандарт, который вы можете указать и который каким-то образом соответствует тому, что вы пробовали. Правила сопоставления
Названия локалей немного расплывчаты, потому что стандартизация в этой области слаба. Снова увидеть
«Нахождение локаций» об общих правилах.

Фиксация система местный конфигурация
Свяжитесь с системным администратором (желательно своим) и сообщите точное сообщение об ошибке.
вы получите, и попросите их прочитать ту же самую документацию, которую вы сейчас читаете. Они должны быть
возможность проверить, есть ли что-то не так с конфигурацией локали
система. В разделе «Поиск регионов», к сожалению, нет точных сведений о точном
команды и места, потому что эти вещи не стандартизированы.

Команда локеконв функция
Функция "POSIX :: localeconv ()" позволяет получить подробные сведения о зависящей от локали
информация о числовом форматировании, заданная текущим базовым "LC_NUMERIC" и
Локали "LC_MONETARY" (независимо от того, вызывается ли из области "использования локали"
или нет). (Если вам просто нужно название текущей локали для определенной категории, используйте
«POSIX :: setlocale ()» с одним параметром - см. «Функция setlocale».)

используйте POSIX qw (locale_h);

# Получить ссылку на хэш информации, зависящей от локали
$ locale_values ​​= localeconv ();

# Вывести отсортированный список значений
for (ключи сортировки% $ locale_values) {
printf "% -20s =% s \ n", $ _, $ locale_values ​​-> {$ _}
}

localeconv () не принимает аргументов и возвращает a ссылка в хеш. Ключи от этого
hash - это имена переменных для форматирования, такие как «decimal_point» и «ousand_sep ». В
значения - это соответствующие значения. См. "Localeconv" в POSIX для более подробного примера.
перечисление категорий, которые может ожидать реализация; некоторые предоставляют больше
а других меньше. Вам не нужно явное "использовать локаль", потому что "localeconv ()" всегда
соблюдает текущую локаль.

Вот простой пример программы, которая переписывает свои параметры командной строки как
целые числа правильно отформатированы в текущей локали:

используйте POSIX qw (locale_h);

# Получить некоторые параметры форматирования чисел локали
мой ($ousand_sep, $ группировка) =
@ {localeconv ()} {',XNUMX_sep ',' группировка '};

# Применить значения по умолчанию, если значения отсутствуют
$ousand_sep = ',' если только $ousand_sep;

# grouping и mon_grouping - это упакованные списки
# маленьких целых чисел (символов), указывающих
# группировка (тысяча_сек и месяц_тысяч_сепс
# будучи разделителями групп) чисел и
# денежные суммы. Значение целых чисел:
# 255 означает отсутствие группировки, 0 означает повтор
# предыдущая группировка 1-254 означает использование этого
# как текущая группировка. Группировка идет от
# справа налево (от младших к старшим цифрам). в
# ниже мы немного обманываем, никогда ничего не используя
# кроме первой группы (что бы это ни было).
if ($ grouping) {
@grouping = unpack ("C *", $ grouping);
} Еще {
@группировка = (3);
}

# Форматировать параметры командной строки для текущей локали
для (@ARGV) {
$ _ = int; # Нарезать нецелую часть
1 пока
s / (\ d) (\ d {$ grouping [0]} ($ | $ousand_sep)) / $ 1 $ousand_sep $ 2 /;
напечатать "$ _";
}
печать "\ п";

Обратите внимание: если на платформе нет доступных "LC_NUMERIC" и / или "LC_MONETARY" или
включен, соответствующие элементы хеша будут отсутствовать.

I18N :: Langinfo
Другой интерфейс для запроса информации, зависящей от локали, - это
Функция «I18N :: Langinfo :: langinfo ()», доступная как минимум в Unix-подобных системах и VMS.

В следующем примере импортируется сама функция langinfo () и три константы в
использоваться в качестве аргумента для "langinfo ()": константа для сокращенного первого дня недели.
(нумерация начинается с воскресенья = 1) и еще две константы для утвердительного и
отрицательные ответы на вопрос «да / нет» в текущей локали.

используйте I18N :: Langinfo qw (langinfo ABDAY_1 YESSTR NOSTR);

мой ($ abday_1, $ yesstr, $ nostr)
= карта {langinfo} qw (ABDAY_1 YESSTR NOSTR);

напечатайте "$ abday_1? [$ yesstr / $ nostr]";

Другими словами, в языковом стандарте "C" (или на английском языке) указанное выше, вероятно, напечатает что-то
как:

Солнце? [да нет]

См. I18N :: Langinfo для получения дополнительной информации.

МЕСТО КАТЕГОРИИ


В следующих подразделах описаны основные категории языковых стандартов. Помимо этого, некоторые
Комбинированные категории позволяют одновременно управлять более чем одной базовой категорией. Видеть
«ОКРУЖАЮЩАЯ СРЕДА» для их обсуждения.

Категория «LC_COLLATE»: сличение
В рамках формы «использовать локаль», которая включает сопоставление, Perl обращается к
Переменная среды "LC_COLLATE" для определения представлений приложения о сопоставлении
(порядок) персонажей. Например, "b" следует за "a" в латинских алфавитах, но где же
"а" и "аа" принадлежат? И хотя «цвет» следует за «шоколадом» в английском языке, как насчет
традиционный испанский?

Все следующие сопоставления имеют смысл, и вы можете встретить любое из них, если «используете локаль».

ABCDE abcde
А А Б Б В В Г Д Д Д
а А б Б в В г Г д Д
abcde ABCDE

Вот фрагмент кода, чтобы узнать, какие символы "слова" присутствуют в текущем языковом стандарте, в этом
порядок локали:

использовать локаль;
print + (sort grep / \ w /, map {chr} 0..255), "\ n";

Сравните это с персонажами, которые вы видите, и их порядком, если вы прямо укажете, что
языковой стандарт следует игнорировать:

нет локали;
print + (sort grep / \ w /, map {chr} 0..255), "\ n";

Это машинное сопоставление (это то, что вы получаете, если не появилось "использовать локаль"
ранее в том же блоке) должны использоваться для сортировки необработанных двоичных данных, тогда как локаль-
зависимая сортировка первого примера полезна для естественного текста.

Как отмечено в разделе «ИСПОЛЬЗОВАНИЕ МЕСТ», «cmp» сравнивается в соответствии с текущим языковым стандартом сопоставления, когда
"использовать локаль" действует, но возвращается к сравнению символов по символам для строк, которые
язык говорит, что равны. Вы можете использовать "POSIX :: strcoll ()", если не хотите этого падения -
обратно:

используйте POSIX qw (strcoll);
$ equal_in_locale =
! strcoll ("пробел и регистр игнорируются", "SpaceAndCaseIgnored");

$ equal_in_locale будет истинным, если локаль сопоставления определяет порядок, подобный словарю
который полностью игнорирует пробелы и убирает регистр.

Perl в настоящее время поддерживает только однобайтовые языковые стандарты для "LC_COLLATE". Это означает, что
Локаль UTF-8, скорее всего, просто даст вам машинный заказ. Используйте Unicode :: Collate для
полная реализация алгоритма сортировки Unicode.

Если у вас есть единственная строка, которую вы хотите проверить на «равенство в локали» с
несколько других, вы можете подумать, что можете немного повысить эффективность, используя
«POSIX :: strxfrm ()» в сочетании с «eq»:

используйте POSIX qw (strxfrm);
$ xfrm_string = strxfrm («Строка в смешанном регистре»);
print "сопоставление языковых стандартов игнорирует пробелы \ n"
если $ xfrm_string eq strxfrm ("Строка смешанного регистра");
print "при сопоставлении языковых стандартов дефисы игнорируются \ n"
если $ xfrm_string eq strxfrm ("Строка в смешанном регистре");
print "при сопоставлении языковых стандартов регистр не учитывается \ n"
если $ xfrm_string eq strxfrm ("строка в смешанном регистре");

"strxfrm ()" берет строку и отображает ее в преобразованную строку для использования в char-by-char
сравнения с другими преобразованными строками во время сопоставления. «Под капотом», локаль-
затронутые операторы сравнения Perl вызывают "strxfrm ()" для обоих операндов, а затем выполняют операцию char-by-
char сравнение преобразованных строк. Вызывая "strxfrm ()" явно и используя
сравнение, не зависящее от языкового стандарта, в примере предпринимается попытка сохранить пару преобразований.
Но на самом деле ничего не спасает: магия Perl (см. «Волшебные переменные» в perlguts)
создает преобразованную версию строки при первом сравнении,
затем сохраните эту версию на случай, если она снова понадобится. Пример переписанного простого
путь с "cmp" работает примерно так же быстро. Он также справляется с нулевыми символами, встроенными в
струны; если вы вызываете "strxfrm ()" напрямую, он обрабатывает первый найденный нуль как
терминатор. не ожидайте, что преобразованные строки, которые он производит, будут переносимы между
систем - или даже от одной версии вашей операционной системы к другой. Короче не надо
вызовите "strxfrm ()" напрямую: пусть Perl сделает это за вас.

Примечание. «Использовать локаль» не показано в некоторых из этих примеров, потому что это не нужно:
strcoll () и strxfrm () - это функции POSIX, которые используют стандартные системные
Функции "libc", которые всегда подчиняются текущей локали "LC_COLLATE".

Категория «LC_CTYPE»: Характер Тип
В рамках формы «использовать языковой стандарт», которая включает «LC_CTYPE», Perl подчиняется «LC_CTYPE»
настройка локали. Это контролирует представление приложения о том, какие символы
буквенные, числовые, знаки препинания, и т.д. Это влияет на регулярное выражение Perl "\ w"
метанотация, которая обозначает буквенно-цифровые символы, то есть буквенные, числовые и
родное подчеркивание платформы. (Обратитесь к perlre для получения дополнительной информации о регулярных
выражений.) Благодаря "LC_CTYPE", в зависимости от настроек вашего локали, такие символы, как
"ae", "` "," ss "и" o "можно понимать как символы" \ w ". Это также влияет на вещи
например, «\ s», «\ D» и классы символов POSIX, например «[[: graph:]]». (Видеть
perlrecharclass для получения дополнительной информации обо всем этом.)

Локаль "LC_CTYPE" также предоставляет карту, используемую для транслитерации символов между
строчные и прописные буквы. Это влияет на функции отображения регистра - "fc ()", "lc ()",
«lcfirst ()», «uc ()» и «ucfirst ()»; интерполяция case-mapping с "\ F", "\ l", "\ L",
«\ u» или «\ U» в строках, заключенных в двойные кавычки, и при замене «s ///»; и не зависящие от регистра
сопоставление шаблонов регулярных выражений с использованием модификатора «i».

Наконец, "LC_CTYPE" влияет на (устаревший) тест символьного класса POSIX.
функции - «POSIX :: isalpha ()», «POSIX :: islower ()» и так далее. Например, если вы переедете
из языкового стандарта "C" в 7-битный ISO 646, вы можете обнаружить - возможно, к своему удивлению, - что
"|" перемещается из класса «POSIX :: ispunct ()» в «POSIX :: isalpha ()». К сожалению, это
создает большие проблемы для регулярных выражений. "|" по-прежнему означает чередование, хотя это
соответствует "\ w". Начиная с v5.22, при переключении такого языкового стандарта будет появляться предупреждение.
в. Более подробная информация приводится в нескольких абзацах ниже.

Начиная с v5.20, Perl поддерживает локали UTF-8 для "LC_CTYPE", но в остальном только Perl
поддерживает однобайтовые локали, такие как серия ISO 8859. Это означает, что широкий характер
локали, например для азиатских языков, не поддерживаются должным образом. (Если на платформе
способность Perl обнаруживать такую ​​локаль, начиная с Perl v5.22, будет предупреждать Perl,
по умолчанию включен, с использованием категории предупреждений "языковой стандарт" при каждом переключении такого языкового стандарта
в.) Поддержка локали UTF-8 на самом деле является надмножеством локалей POSIX, потому что она
действительно полное поведение Unicode, как если бы языковой стандарт "LC_CTYPE" вообще не действовал (за исключением
порча; см. «БЕЗОПАСНОСТЬ»). В локали POSIX, даже в UTF-8, отсутствуют определенные концепции.
в Unicode, например, идея о том, что изменение регистра символа может быть расширено, чтобы
чем один персонаж. Perl в языковом стандарте UTF-8 предоставит вам такое расширение. До
v5.20, Perl обрабатывал локаль UTF-8 на некоторых платформах, например, ISO 8859-1, с некоторыми
ограничения, а на других платформах больше похоже на локаль "C". Для выпусков v5.16 и
v5.18, "использовать locale 'not_characters" можно было бы использовать как обходной путь для этого (см. "Unicode
и UTF-8 ").

Обратите внимание, что есть довольно много вещей, на которые текущая локаль не влияет. Любой
буквальный символ - это родной символ для данной платформы. Следовательно, 'A' означает
символ в кодовой точке 65 на платформах ASCII и 193 на EBCDIC. Это может быть или не быть
«A» в текущем языковом стандарте, если в этом языковом стандарте даже есть «A». Точно так же все побеги
последовательности для определенных символов, например "\ n", всегда означают родные для платформы
один. Это означает, например, что "\ N" в регулярных выражениях (каждый символ, кроме новых -
line) работает с набором символов платформы.

Начиная с v5.22, Perl по умолчанию будет предупреждать при переключении на языковой стандарт, который переопределяет
любой печатаемый символ ASCII (плюс «\ t» и «\ n») в другой класс, чем ожидалось.
Это, вероятно, произойдет в современных регионах только на платформах EBCDIC, где, например,
Локаль CCSID 0037 на компьютере с CCSID 1047 перемещает "[", но это может происходить на платформах ASCII.
с ISO 646 и другими 7-битными языковыми стандартами, которые по существу устарели. Вещи могут еще
работать, в зависимости от того, какие возможности Perl использует программа. Например, в
пример сверху, где "|" становится "\ w", и нет регулярных выражений, где
это имеет значение, программа может работать должным образом. В предупреждении перечислены все символы.
что он может определить, на что может быть оказано неблагоприятное воздействие.

Примечание: Неверное или вредоносное определение локали "LC_CTYPE" может привести к явной непригодности
символы, которые ваше приложение считает буквенно-цифровыми. Для строгого соответствия
из (обыденных) букв и цифр ASCII - например, в командных строках - с учетом локали
приложения должны использовать "\ w" с модификатором регулярного выражения "/ a". См. «БЕЗОПАСНОСТЬ».

Категория «LC_NUMERIC»: Числовой форматирование
После правильного вызова «POSIX :: setlocale ()» и в рамках формы «использовать локаль»
который включает числа, Perl подчиняется информации локали "LC_NUMERIC", которая управляет
представление приложения о том, как числа должны быть отформатированы для удобства чтения человеком. В большинстве
реализациях единственный эффект - изменить символ, используемый для десятичной
точка - возможно, от "." к ",". Функции не знают таких тонкостей, как тысячи
разделение и так далее. (См. «Функция localeconv», если вам это небезразлично.)

использовать POSIX qw (strtod setlocale LC_NUMERIC);
использовать локаль;

setlocale LC_NUMERIC, "";

$ n = 5/2; # Присвойте число 2.5 к $ n

$ a = "$ n"; # Преобразование в строку, зависящую от локали

выведите «половина пятерки - это $ n \ n»; # Выходные данные, зависящие от локали

printf "половина пятерки - это% g \ n", $ n; # Выходные данные, зависящие от локали

print "ДЕСЯТИЧНАЯ ТОЧКА ЗАПЯТА \ n"
если $ n == (strtod ("2,5")) [0]; # Конверсия в зависимости от локали

См. Также I18N :: Langinfo и «RADIXCHAR».

Категория "LC_MONETARY": форматирование of денежный суммы
Стандарт C определяет категорию "LC_MONETARY", но не функцию, на которую влияет
его содержимое. (Те, у кого есть опыт работы с комитетами по стандартам, поймут, что
рабочая группа решила заняться этим вопросом.) Следовательно, Perl, по сути, не принимает
уведомление об этом. Если вы действительно хотите использовать «LC_MONETARY», вы можете запросить его содержимое - см.
"Функция localeconv" - и используйте информацию, которую она возвращает в вашем приложении
собственное форматирование денежных сумм. Однако вы вполне можете обнаружить, что информация,
объемный и сложный, но не совсем отвечающий вашим требованиям:
форматирование валюты - крепкий орешек.

См. Также I18N :: Langinfo и «CRNCYSTR».

«LC_TIME»
Вывод, производимый "POSIX :: strftime ()", который создает форматированную удобочитаемую дату / время.
строка, зависит от текущего языкового стандарта "LC_TIME". Таким образом, во французском языке вывод
созданный элементом формата% B (полное название месяца) для первого месяца года, будет
быть «janvier». Вот как получить список длинных названий месяцев в текущей локали:

используйте POSIX qw (strftime);
для (0..11) {
$ long_month_name [$ _] =
strftime ("% B", 0, 0, 0, 1, $ _, 96);
}

Примечание: «использовать локаль» в этом примере не требуется: «strftime ()» - это функция POSIX, которая
использует стандартную системную функцию "libc", которая всегда подчиняется текущему "LC_TIME"
локали.

См. Также I18N :: Langinfo и "ABDAY_1" .. "ABDAY_7", "DAY_1" .. "DAY_7", "ABMON_1" .. "ABMON_12",
и «АБМОН_1» .. «АБМОН_12».

Другой категории
Остальные категории локалей в настоящее время не используются самим Perl. Но снова обратите внимание
вещи, с которыми взаимодействует Perl, могут их использовать, включая расширения, не входящие в стандартную
Дистрибутив Perl, а также операционная система и ее утилиты. Обратите особое внимание на то, что
строковое значение $! и сообщения об ошибках, выдаваемые внешними утилитами, могут быть изменены
автор: "LC_MESSAGES". Если вы хотите иметь переносимые коды ошибок, используйте «%!». См. Эррно.

БЕЗОПАСНОСТЬ


Хотя основное обсуждение вопросов безопасности Perl можно найти в perlsec, обсуждение
обработки локали Perl было бы неполным, если бы она не привлекала ваше внимание к локали-
зависимые вопросы безопасности. Локали - особенно в системах, которые позволяют непривилегированным пользователям
строить свои локации - ненадежны. Вредоносный (или просто сломанный) языковой стандарт
может заставить приложение с поддержкой локали давать неожиданные результаты. Вот несколько
возможности:

· Проверки регулярных выражений на предмет безопасных имен файлов или почтовых адресов с использованием "\ w" могут быть
подделано языковым стандартом "LC_CTYPE", который утверждает, что такие символы, как ">" и "|" являются
буквенно-цифровой.

· Строковая интерполяция с преобразованием регистра, например, "$ dest =" C: \ U $ name. $ Ext "", может
приводят к опасным результатам, если действует фиктивная таблица преобразования регистра "LC_CTYPE".

· Подлый языковой стандарт "LC_COLLATE" может привести к именам учащихся с оценками "D"
появляясь впереди тех, у кого есть «пятерки».

· Приложение, которое пытается использовать информацию в "LC_MONETARY", может форматировать
дебетуются, как если бы они были кредитами, и наоборот, если эта локаль была нарушена. Или
он может производить платежи в долларах США вместо гонконгских долларов.

· Имена даты и дня в датах, отформатированных с помощью "strftime ()", могут быть изменены таким образом, чтобы
преимущество злонамеренного пользователя, способного нарушить локаль "LC_DATE". ("Смотри - там сказано, что я
не было в здании в воскресенье. ")

Такие опасности не свойственны языковой системе: любой аспект приложения
среда, которая может быть изменена злонамеренно, представляет аналогичные проблемы. Так же,
они не относятся к Perl: любой язык программирования, позволяющий писать программы.
которые принимают во внимание их окружающую среду, подвергают вас этим проблемам.

Perl не может защитить вас от всех возможностей, показанных в примерах - нет
заменит вашу бдительность - но, когда действует "использовать локаль", Perl использует
механизм заражения (см. perlsec) для отметки строковых результатов, которые становятся зависимыми от локали, и
что в результате может оказаться ненадежным. Вот краткое изложение порочного поведения
операторы и функции, на которые может повлиять языковой стандарт:

· сравнение Операторы («lt», «le», «ge», «gt» и «cmp»):

Скалярный результат «истина / ложь» (или меньше / равен / больше) никогда не искажается.

· Отображение случаев интерполяция (с «\ l», «\ L», «\ u», «\ U» или «\ F»)

Строка результата, содержащая интерполированный материал, испорчена, если форма "использовать локаль"
который включает "LC_CTYPE".

· Согласование оператор ("м //"):

Скалярный результат «истина / ложь» никогда не искажается.

Все подшаблоны, либо предоставленные как результат контекста списка, либо как $ 1 и т.д., испорчены
если действует форма «использовать языковой стандарт», которая включает «LC_CTYPE», а подшаблон
регулярное выражение содержит конструкцию, зависящую от локали. Эти конструкции включают
«\ w» (для соответствия буквенно-цифровому символу), «\ W» (не буквенно-цифровой символ), «\ b» и
«\ B» (границы слова и без границ, в зависимости от того, что совпадают «\ w» и «\ W»), «\ s»
(символ пробела), «\ S» (символ без пробела), «\ d» и «\ D» (цифры и
нецифровые) и классы символов POSIX, такие как «[: alpha:]» (см. «POSIX
Классы персонажей »в perlrecharclass).

Также возможно заражение, если шаблон должен быть сопоставлен без учета регистра (через "/ i").
Исключение составляют случаи, когда все кодовые точки, которые должны быть сопоставлены таким образом, превышают 255 и делают
не иметь складок по правилам Unicode ниже 256. Для этих
поскольку Perl использует только правила Unicode для таких кодовых точек, и эти правила являются
одинаково вне зависимости от текущего языка.

Переменные сопоставленного шаблона: $ &, "$` "(до сопоставления)," $ '"(после сопоставления) и $ + (последнее
матч) также испорчены.

· подмена оператор ("s ///"):

Имеет то же поведение, что и оператор сопоставления. Кроме того, левый операнд "= ~" становится
испорчены, когда действует форма «использовать локаль», которая включает «LC_CTYPE», если она изменена как
результат подстановки, основанной на совпадении регулярного выражения, включающем любой из
вещи, упомянутые в предыдущем пункте, или отображение регистра, например "\ l", "\ L", "\ u",
«\ U» или «\ F».

· Результат форматирование Функции ("printf ()" и "write ()"):

Результаты никогда не искажаются, потому что в противном случае даже вывод из печати, например
"print (1/7)" должен быть испорчен, если действует "использовать локаль".

· Отображение случаев Функции («lc ()», «lcfirst ()», «uc ()», «ucfirst ()»):

Результаты испорчены, если действует форма «использовать языковой стандарт», включающую «LC_CTYPE».

· POSIX зависит от локали Функции ("localeconv ()", "strcoll ()", "strftime ()",
"strxfrm ()"):

Результаты никогда не испорчены.

· POSIX персонаж класс тестов ("POSIX :: isalnum ()", "POSIX :: isalpha ()",
«POSIX :: isdigit ()», «POSIX :: isgraph ()», «POSIX :: islower ()», «POSIX :: isprint ()»,
«POSIX :: ispunct ()», «POSIX :: isspace ()», «POSIX :: isupper ()», «POSIX :: isxdigit ()»):

Истинные / ложные результаты никогда не искажаются.

Три примера иллюстрируют заражение, зависящее от локали. Первая программа, которая игнорирует свой
locale, запускаться не будет: значение, взятое непосредственно из командной строки, не может использоваться для имени
выходной файл, когда включены проверки на заражение.

# / usr / local / bin / perl -T
# Запуск с проверкой на заражение

# Проверка работоспособности командной строки пропущена ...
$ tainted_output_file = сдвиг;

open (F, "> $ tainted_output_file")
или предупредить: «Не удалось открыть файл $ tainted_output_file: $! \ n»;

Программу можно заставить работать, "отмыв" испорченное значение через обычный
выражение: второй пример, который по-прежнему игнорирует информацию о локали, запускается, создавая
файл, названный в его командной строке, если это возможно.

# / usr / local / bin / perl -T

$ tainted_output_file = сдвиг;
$ tainted_output_file = ~ м% [\ w /] +%;
$ untainted_output_file = $ &;

open (F, "> $ untainted_output_file")
или предупредить: «Не удалось открыть файл $ untainted_output_file: $! \ n»;

Сравните это с аналогичной программой, но с учетом локали:

# / usr / local / bin / perl -T

$ tainted_output_file = сдвиг;
использовать локаль;
$ tainted_output_file = ~ м% [\ w /] +%;
$ localized_output_file = $ &;

open (F, "> $ localized_output_file")
или предупредить: «Не удалось открыть файл $ localized_output_file: $! \ n»;

Эта третья программа не запускается, потому что $ & испорчен: это результат совпадения
с участием "\ w", в то время как действует "использовать локаль".

ОКРУЖАЮЩАЯ СРЕДА


PERL_SKIP_LOCALE_INIT
Эта переменная среды, доступная начиная с Perl v5.20, если установлена ​​(для любого
value), сообщает Perl не использовать остальные переменные среды для
инициализировать с помощью. Вместо этого Perl использует любые текущие настройки локали.
Это особенно полезно во встроенных средах, см. «Использование встроенного Perl.
с языковыми стандартами POSIX »в perlembed.

PERL_BADLANG
Строка, которая может подавить предупреждение Perl о неудачных настройках локали на
запускать. Сбой может произойти, если поддержка локали в операционной системе
отсутствует (не работает) каким-либо образом - или если вы неправильно набрали название языка, когда вы
настройте вашу среду. Если эта переменная среды отсутствует или имеет
значение, отличное от "0" или "", Perl будет жаловаться на ошибки настройки локали.

ЗАМЕТКА: «PERL_BADLANG» позволяет только скрыть предупреждающее сообщение. В
сообщение сообщает о какой-то проблеме в поддержке локали вашей системы, и вы
следует выяснить, в чем проблема.

DPKG_RUNNING_VERSION
В системах Debian, если переменная среды DPKG_RUNNING_VERSION установлена ​​(на
любое значение), предупреждения о сбое языкового стандарта будут подавлены так же, как с
нулевое значение PERL_BADLANG. Это сделано, чтобы избежать потока ложных предупреждений.
во время обновления системы. Видетьhttp://bugs.debian.org/508764>.

Следующие переменные среды не являются специфическими для Perl: они являются частью
стандартизированный (ISO C, XPG4, POSIX 1.c) метод "setlocale ()" для управления
мнение приложения о данных. Windows не является POSIX, но Perl предлагает следующие возможности:
в любом случае работать, как описано. Если языковой стандарт, заданный переменной среды, недопустим,
Perl пробует следующий более низкий приоритет. Если ни один из них не действителен, в Windows система
Затем пробуется локаль по умолчанию. Если ничего не помогает, используется локаль "C". Если даже это
не работает, что-то сильно сломано, но Perl пытается продвигаться вперед с тем, что
настройки локали могут быть.

«LC_ALL» «LC_ALL» - это переменная среды языкового стандарта «переопределить все». Если установлено, это
отменяет все остальные переменные среды локали.

"ЯЗЫК" ЗАМЕТКА: "LANGUAGE" - это расширение GNU, оно влияет на вас, только если вы используете
GNU libc. Это тот случай, если вы используете, например, Linux. Если вы используете
"коммерческие" Unix-системы вы, скорее всего, используя GNU libc, и вы можете
игнорировать "ЯЗЫК".

Однако, если вы используете "LANGUAGE": это влияет на язык
информационные сообщения, предупреждения и сообщения об ошибках, выводимые командами (другими словами,
он похож на "LC_MESSAGES"), но имеет более высокий приоритет, чем "LC_ALL". Кроме того,
это не одно значение, а "путь" (список, разделенный ":") языки
(не региональные стандарты). См. Документацию библиотеки GNU "gettext" для получения дополнительной информации.
Информация.

«LC_CTYPE» При отсутствии «LC_ALL» «LC_CTYPE» выбирает языковой стандарт символьного типа. В
отсутствие как «LC_ALL», так и «LC_CTYPE», «LANG» выбирает тип символа
локали.

"LC_COLLATE"
В отсутствие «LC_ALL» «LC_COLLATE» выбирает сопоставление (сортировку)
локаль. При отсутствии как «LC_ALL», так и «LC_COLLATE», «LANG» выбирает
локаль сопоставления.

"LC_MONETARY"
При отсутствии «LC_ALL» «LC_MONETARY» выбирает денежное форматирование.
локаль. При отсутствии как «LC_ALL», так и «LC_MONETARY», «LANG» выбирает
локаль денежного форматирования.

"LC_NUMERIC"
При отсутствии «LC_ALL» «LC_NUMERIC» выбирает языковой стандарт числового формата.
При отсутствии как «LC_ALL», так и «LC_NUMERIC», «LANG» выбирает числовой
формат.

"LC_TIME" При отсутствии "LC_ALL" "LC_TIME" выбирает форматирование даты и времени.
локаль. При отсутствии как «LC_ALL», так и «LC_TIME», «LANG» выбирает
локаль форматирования даты и времени.

«LANG» «LANG» - это универсальная переменная среды локали. Если он установлен, это
используется в качестве последнего средства после общего "LC_ALL" и категории, относящейся к конкретной категории.
«LC_фу ".

Примеры
"LC_NUMERIC" управляет числовым выводом:

использовать локаль;
используйте POSIX qw (locale_h); # Импортирует setlocale () и константы LC_.
setlocale (LC_NUMERIC, "fr_FR") или умри "Pardon";
printf "% g \ n", 1.23; # Если "fr_FR" завершился успешно, вероятно, отображается 1,23.

а также то, как "POSIX :: strtod ()" анализирует строки как числа:

использовать локаль;
используйте POSIX qw (locale_h strtod);
setlocale (LC_NUMERIC, "de_DE") или die "Entschuldigung";
мой $ x = strtod ("2,34") + 5;
напечатать $ x, "\ n"; # Вероятно показывает 7,34.

ПРИМЕЧАНИЯ


строка "eval" и "LC_NUMERIC"
Строка eval анализирует свое выражение как стандартный Perl. Поэтому ожидается, что
десятичная точка должна быть точкой. Если для параметра "LC_NUMERIC" выбрана запятая, то
парсинг запутается, возможно молча.

использовать локаль;
используйте POSIX qw (locale_h);
setlocale (LC_NUMERIC, "fr_FR") или умри "Pardon";
мой $ a = 1.2;
напечатать eval "$ a + 1.5";
печать "\ п";

печатает «13,5». Это потому, что в этом языковом стандарте запятая является символом десятичной точки.
Таким образом, "eval" расширяется до:

eval "1,2 + 1.5"

и результат не такой, как вы ожидали. Никаких предупреждений не генерируется. Если ты это сделаешь
строка "eval" находится в пределах "использовать локаль", вместо этого вам следует изменить "eval"
строка, чтобы сделать что-то вроде:

напечатать eval "без локали; $ a + 1.5";

Это печатает 2.7.

Вы также можете исключить "LC_NUMERIC", если он вам не нужен,

используйте языковой стандарт ':! numeric';

назад совместимость
Версии Perl до 5.004 в основном игнорирует информацию о локали, обычно ведет себя как
если что-то похожее на локаль "C" всегда было в силе, даже если программа
среда предложила иное (см. «Функция setlocale»). По умолчанию Perl по-прежнему
ведет себя так для обратной совместимости. Если вы хотите, чтобы приложение Perl платило
внимание к информации о регионе, вы должен используйте прагму "use locale" (см. "The" use
locale "pragma") или, в маловероятном случае, если вы захотите сделать это просто по шаблону
сопоставление, модификатор регулярного выражения "/ l" (см. "Модификаторы набора символов" в perlre)
чтобы проинструктировать его сделать это.

Версии Perl от 5.002 до 5.003 действительно использовали информацию «LC_CTYPE», если таковая имеется; тот
"\ w" действительно понял, какие буквы были в соответствии с локальным окружением
переменные. Проблема заключалась в том, что пользователь не мог контролировать эту функцию: если C
Библиотека поддерживала локали, Perl использовал их.

I18N: Разобрать по копиям устаревший
В версиях Perl до 5.004 сортировка по локали была возможна с использованием
Библиотечный модуль "I18N :: Collate". Этот модуль сейчас немного устарел, и его следует избегать.
в новых приложениях. Функциональность "LC_COLLATE" теперь интегрирована в ядро ​​Perl.
язык: можно совершенно нормально использовать скалярные данные, специфичные для локали, с помощью "use locale",
так что больше нет необходимости жонглировать скалярными ссылками "I18N :: Collate".

Сортировать скорость и Память использование Воздействие
Сравнение и сортировка по языку обычно медленнее, чем сортировка по умолчанию; замедления
наблюдались от двух до четырех раз. Он также будет потреблять больше памяти: как только Perl
скалярная переменная участвовала в любой операции сравнения или сортировки строк в соответствии с
locale collation rules, это займет в 3-15 раз больше памяти, чем раньше. (Точный
множитель зависит от содержимого строки, операционной системы и языкового стандарта.)
Обратные стороны больше продиктованы реализацией языковой системы операционной системой
чем на Perl.

Свободно доступен местный Определения
Проект Unicode CLDR извлекает часть POSIX из многих своих локалей, доступных по адресу

http://unicode.org/Public/cldr/latest/

Существует большая коллекция определений языковых стандартов по адресу:

http://std.dkuug.dk/i18n/WG15-collection/locales/

Вы должны знать, что он не поддерживается и не претендует на пригодность для каких-либо целей.
Если ваша система допускает установку произвольных локалей, вы можете найти определения
полезны сами по себе или в качестве основы для развития ваших собственных регионов.

I18n и l10n
«Интернационализация» часто сокращается как i18n потому что его первая и последняя буквы
разделены восемнадцатью другими. (Вы можете догадаться, почему внутреннее ... внутреннее ...
сокращается). Точно так же термин "локализация" часто сокращается до l10n.

An несовершенный стандарт
Интернационализацию, как это определено в стандартах C и POSIX, можно критиковать как
неполные, неуклюжие и имеющие слишком большую степень детализации. (Локали применяются ко всему
процесс, когда, возможно, было бы более полезно применить их к одному потоку,
оконная группа или что-то в этом роде.) Они также имеют тенденцию, как и группы стандартов, разделять
мир на нации, когда мы все знаем, что мир может быть разделен на
банкиры, байкеры, геймеры и так далее.

Unicode и UTF-8


Поддержка Unicode появилась впервые, начиная с версии Perl v5.6, и реализована более полно.
в версиях v5.8 и новее. См. Perluniintro.

Начиная с Perl v5.20, в Perl поддерживаются локали UTF-8, за исключением «LC_COLLATE» (используйте
Unicode :: Collate вместо этого). Если у вас установлен Perl v5.16 или v5.18 и вы не можете выполнить обновление, вы можете использовать

используйте локаль ': not_characters';

Когда используется эта форма прагмы, используются только несимвольные части локалей.
на Perl, например "LC_NUMERIC". Perl предполагает, что вы перевели все
символы, с которыми он должен работать, в Unicode (фактически, собственный набор символов платформы
(ASCII или EBCDIC) плюс Unicode). Для данных в файлах это удобно сделать также
указав

используйте open ': locale';

Эта прагма обеспечивает перевод всех входных данных из файлов в Unicode из
текущая локаль, как указано в среде (см. «ОКРУЖАЮЩАЯ СРЕДА»), и все выходы для
файлы, которые нужно перевести обратно в языковой стандарт. (Смотрите открытые). Для каждого дескриптора файла вы
вместо этого можно использовать модуль PerlIO :: locale или модуль Encode :: Locale, оба доступны
из CPAN. В последнем модуле также есть методы, упрощающие работу с «ARGV» и
переменные среды и могут использоваться для отдельных строк. Если ты знаешь, что все твои
locales будут UTF-8, как и многие в наши дни, вы можете использовать -C переключатель командной строки.

Эта форма прагмы позволяет по существу беспрепятственно обрабатывать локали с помощью Unicode. В
порядок сортировки будет по порядку кодовой точки Unicode. Настоятельно рекомендуется, когда
вам нужно упорядочить и отсортировать строки, которые вы используете стандартный модуль Unicode :: Collate, который
дает намного лучшие результаты во многих случаях, чем вы можете получить с локалью старого стиля
обработки.

Все только что описанные модули и переключатели могут быть использованы в версии 5.20 при простом использовании.
locale ", и, если языковые стандарты ввода не UTF-8, вы получите менее чем идеальный
описанное ниже поведение, которое вы получаете с Perls до версии 5.16, или когда вы используете локаль
pragma без параметра: not_characters в v5.16 и v5.18. Если вы используете
исключительно локали UTF-8 в версии 5.20 и выше, остальная часть этого раздела не применяется к
вас.

Есть два случая: многобайтовые и однобайтовые языковые стандарты. Первый многобайтный:

Единственная локаль с многобайтовыми (или широкими символами), которую Perl может поддерживать когда-либо, - это
UTF-8. Это связано со сложностью реализации, тем, что качественный UTF-8
локали теперь публикуются для всех регионов мира
(<http://unicode.org/Public/cldr/latest/>), и при отсутствии всего, что вы можете использовать
Модуль кодирования для перевода на / из вашего языкового стандарта. Итак, вам придется сделать одну из этих вещей
если вы используете одну из этих локалей, например Big5 или Shift JIS. Для локалей UTF-8 в
Perls (до версии 5.20), у которых нет полной поддержки локали UTF-8, они могут работать достаточно хорошо
(в зависимости от реализации вашей библиотеки C) просто потому, что и они, и Perl хранят
символы, которые одинаково занимают несколько байтов. Однако некоторые, если не большинство, C
реализации библиотеки могут не обрабатывать символы в верхней половине Latin-1
диапазон (128 - 255) правильно под "LC_CTYPE". Чтобы узнать, принадлежит ли персонаж к определенному типу
в локали Perl использует такие функции, как «isalnum ()». Ваша библиотека C может не работать для
Локали UTF-8 с этими функциями работают только в более новой широкой библиотеке.
такие функции, как iswalnum (), которые Perl не использует. Эти многобайтовые языковые стандарты
обрабатываются как однобайтовые локали и будут иметь ограничения, описанные ниже.
Начиная с Perl v5.22, появляется предупреждающее сообщение, когда Perl обнаруживает многобайтовый языковой стандарт.
что он не полностью поддерживает.

Для однобайтовых локалей Perl обычно использует правила локали для кодовых точек.
который может поместиться в один байт, и правила Unicode для тех, кто не может (хотя это не
равномерно нанесен, см. примечание в конце этого раздела). Это предотвращает множество проблем
в языках, отличных от UTF-8. Предположим, языковой стандарт - ISO8859-7, греческий. Персонаж на
0xD7 есть заглавная Чи. Но в локали ISO8859-1, Latin1, это умножение
подписать. Класс символов регулярного выражения POSIX "[[: alpha:]]" волшебным образом будет соответствовать
0xD7 в греческой локали, но не в латинской.

Однако есть места, где это ломается. Некоторые конструкции Perl предназначены для Unicode
только, например "\ p {Alpha}". Они предполагают, что 0xD7 всегда имеет значение Unicode (или
эквивалент на платформах EBCDIC). Поскольку Latin1 - это подмножество Unicode, а 0xD7 - это
знак умножения как в Latin1, так и в Unicode, "\ p {Alpha}" никогда не будет соответствовать ему,
независимо от локали. Аналогичная проблема возникает с "\ N {...}". До версии 5.20 это
поэтому плохая идея использовать "\ p {}" или "\ N {}" под обычным "использовать локаль" -если не ты можешь
гарантировать, что локаль будет ISO8859-1. Вместо этого используйте классы символов POSIX.

Еще одна проблема с этим подходом заключается в том, что операции, которые пересекают один байт / несколько
границы байта не определены четко и поэтому запрещены. (Эта граница проходит между
кодовые точки в 255/256.) Например, нижний регистр ЛАТИНСКОЙ ЗАГЛАВНОЙ БУКВЫ Y С ДИАРЕЗОМ
(U + 0178) должен возвращать СТРОЧНУЮ ЛАТИНСКУЮ БУКВУ Y С ДИАРЕЗИСОМ (U + 00FF). Но в греческом
locale, например, нет символа в 0xFF, и Perl не имеет возможности узнать, что
символ в 0xFF действительно должен представлять. Таким образом, операция запрещена.
В этом режиме строчная буква U + 0178 - это сама строчная буква.

Те же проблемы возникают, если вы включите автоматическую UTF-8-ификацию вашего стандартного файла.
дескрипторы, слой "open ()" по умолчанию и @ARGV для локалей, отличных от ISO8859-1, не-UTF-8 (с использованием
либо -C переключатель командной строки или переменная среды «PERL_UNICODE»; видеть
perlrun). Вещи читаются как UTF-8, что обычно подразумевает Unicode.
интерпретация, но наличие языкового стандарта заставляет их интерпретировать их в этом языковом стандарте
вместо. Например, кодовая точка 0xD7 на входе Unicode, что должно означать
знак умножения не будет интерпретироваться Perl таким образом в греческой локали. Этот
не является проблемой при условии вы убедитесь, что все регионы будут всегда и только либо
ISO8859-1 или, если у вас нет несовершенной библиотеки C, локаль UTF-8.

Еще одна проблема заключается в том, что этот подход может привести к двум кодовым точкам, означающим одно и то же.
персонаж. Таким образом, в греческой локали и U + 03A7, и U + 00D7 являются ГРЕЧЕСКОЙ ЗАГЛАВНОЙ БУКВОЙ CHI.

Из-за всех этих проблем, начиная с v5.22, Perl выдает предупреждение, если
Кодовая точка байта (следовательно, Unicode) используется, когда действует однобайтовая локаль. (Несмотря на то что
он не проверяет это, если это неоправданно замедлит выполнение.)

Как известно, языковые стандарты поставщика содержат ошибки, и Perl трудно протестировать его языковой стандарт -
обработка кода, поскольку он взаимодействует с кодом, который Perl не контролирует; следовательно
код обработки локали в Perl также может содержать ошибки. (Тем не менее, Unicode-предоставленный
locales должны быть лучше, и есть механизм обратной связи для исправления любых проблем. Видеть
«Свободно доступные определения локали».)

Если у вас Perl v5.16, проблемы, упомянутые выше, исчезнут, если вы воспользуетесь
Параметр ": not_characters" в директиве locale (за исключением ошибок поставщика в не-
части символов). Если у вас нет v5.16, и вы do иметь работающие локали, используя
они могут быть полезны для определенных целей, если вы помните
уже упомянутые ошибки. Например, если сопоставление для ваших локалей работает, оно запускается
быстрее в локали, чем в Unicode :: Collate; и вы получаете доступ к таким вещам, как
символ местной валюты и названия месяцев и дней недели. (Но
В v5.16 вы получаете этот доступ без недостатков локалей,
используя форму прагмы ": not_characters".)

Примечание. Политика использования правил локали для кодовых точек, которые могут умещаться в байтах, и Unicode.
правила для тех, кто не может, не применяются единообразно. До версии 5.12 это было несколько
бессистемно; в v5.12 он довольно последовательно применялся к сопоставлению регулярных выражений
кроме классов символов в квадратных скобках; в v5.14 он был расширен на все совпадения регулярных выражений; и
в v5.16 к операциям с регистром, таким как "\ L" и "uc ()". Для сопоставления во всех выпусках
пока вызывается системная функция strxfrm (), и все, что она делает, вы получаете.

Используйте perllocale в Интернете с помощью сервисов onworks.net


Бесплатные серверы и рабочие станции

Скачать приложения для Windows и Linux

  • 1
    Фунтов на квадратный дюйм
    Фунтов на квадратный дюйм
    Psi — кроссплатформенный мощный XMPP
    клиент, предназначенный для опытных пользователей.
    Есть сборки для MS
    Windows, GNU/Linux и macOS. Аудитория:
    Конечные пользователи...
    Скачать Пси
  • 2
    Блобби залп 2
    Блобби залп 2
    Официальное продолжение знаменитого
    Аркадная игра Blobby Volley 1.x..
    Аудитория: конечные пользователи / рабочий стол. Пользователь
    интерфейс: OpenGL, SDL. Программирование
    Язык: С++, Луа. С...
    Скачать Blobby Volley 2
  • 3
    SuiteCRM
    SuiteCRM
    SuiteCRM — отмеченный наградами клиент
    Управление взаимоотношениями (CRM)
    приложение, представленное вам авторами
    и сопровождающие, SalesAgility. Это
    самый лучший в мире...
    Загрузить SuiteCRM
  • 4
    Poweradmin
    Poweradmin
    Poweradmin — это веб-сервер DNS.
    инструмент администрирования для сервера PowerDNS.
    Интерфейс имеет полную поддержку большинства
    возможностей PowerDNS. Он имеет полный
    служба поддержки...
    Скачать Poweradmin
  • 5
    Джин Веб Фреймворк
    Джин Веб Фреймворк
    Джин - невероятно быстрый веб-фреймворк
    написано на Голанге, может выполнять до
    В 40 раз быстрее благодаря
    мартини-подобный API и кастомная версия
    httprout ...
    Скачать Gin Web Framework
  • 6
    ЦЕРЕУС ЛИНУКС
    ЦЕРЕУС ЛИНУКС
    CEREUS LINUX базируется на MX LINUX con
    различные энторнос де эскриториос. Это
    приложение, которое также можно получить
    от
    https://sourceforge.net/projects/cereu...
    Скачать CEREUS LINUX
  • Больше »

Команды Linux

Ad