Это команда perlunifaq, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
perlunifaq - Часто задаваемые вопросы о Perl Unicode
Q и A
Это список вопросов и ответов о Unicode в Perl, предназначенный для чтения после
перлунитут.
Perlunitut Не на самом деле a Unicode руководство, is Это?
Нет, и это не совсем FAQ по Unicode.
Perl имеет абстрактный интерфейс для всех поддерживаемых кодировок символов, так что это
на самом деле общий учебник "Кодировать" и FAQ "Кодировать". Но многие думают, что Unicode
особенный и волшебный, и я не хотел их разочаровывать, поэтому решил позвонить в
задокументируйте учебное пособие по Unicode.
Что персонаж кодировок приносит Perl поддержка?
Чтобы узнать, какие кодировки символов поддерживает ваш Perl, выполните:
perl -MEncode -le "печать для Encode-> кодировок (': all')"
Который версия of Perl должен I использовать?
Что ж, если можете, обновитесь до последней версии, но обязательно до версии 5.8.1 или новее. Учебник
и FAQ предполагают последнюю версию.
Вам также следует проверить свои модули и при необходимости обновить их. Например,
HTML :: Entities требует версии> = 1.32 для правильной работы, даже если журнал изменений
об этом умалчивает.
Что в отношении двоичный данные " У аборигенов изображений?
Ну, кроме голого "binmode $ fh", особо к ним относиться не стоит. (Бинрежим
необходим, потому что в противном случае Perl может преобразовать окончания строк в системах Win32.)
Однако будьте осторожны, никогда не комбинируйте текстовые строки с двоичными строками. Если вам нужен текст в
двоичный поток, сначала закодируйте свои текстовые строки, используя соответствующую кодировку, затем присоединитесь
их двоичными строками. См. Также: «Что делать, если я не кодирую?».
После появления должен I декодировать or кодировать?
Всякий раз, когда вы связываете текст с чем-либо, что является внешним по отношению к вашему процессу Perl,
например, база данных, текстовый файл, сокет или другая программа. Даже если то, что ты
общение с также написано на Perl.
Что if I не расшифровать?
Всякий раз, когда ваша закодированная двоичная строка используется вместе с текстовой строкой, Perl будет считать, что
что ваша двоичная строка была закодирована с помощью ISO-8859-1, также известного как latin-1. Если бы это не было
latin-1, то ваши данные неприятно конвертируются. Например, если это был UTF-8,
отдельные байты многобайтовых символов рассматриваются как отдельные символы, а затем снова
преобразован в UTF-8. Такое двойное кодирование можно сравнить с двойным кодированием HTML.
("& gt;") или двойное кодирование URI (% 253E).
Это неявное неявное декодирование известно как «обновление». Это может показаться положительным, но это
лучше всего этого избежать.
Что if I не кодировать?
Ваша текстовая строка будет отправлена с использованием байтов во внутреннем формате Perl. В некоторых случаях,
Perl предупредит вас, что вы делаете что-то не так, дружеским предупреждением:
Широкий символ в печати в строке 2 example.pl.
Поскольку внутренним форматом часто является UTF-8, эти ошибки трудно обнаружить, потому что UTF-8
обычно кодировка, которую вы хотели! Но не поленитесь и не используйте тот факт, что Perl
внутренний формат - UTF-8 в ваших интересах. Явное кодирование, чтобы избежать странных ошибок и
покажите программистам сопровождения, что вы это продумали.
Is там a путь в автоматически декодировать or кодировать?
Если все данные, поступающие от определенного дескриптора, кодируются точно так же, вы можете
скажите системе PerlIO, чтобы она автоматически все декодировала с помощью уровня «кодирования». Если
вы делаете это, вы больше не можете случайно забыть декодировать или кодировать вещи, которые используют
многослойная ручка.
Вы можете предоставить этот слой при «открытии» файла:
откройте мой $ fh, '>: encoding (UTF-8)', $ filename; # автоматическое кодирование при записи
откройте мой $ fh, '<: encoding (UTF-8)', $ filename; # автоматическое декодирование при чтении
Или, если у вас уже есть открытый дескриптор файла:
binmode $ fh, ': кодировка (UTF-8)';
Некоторые драйверы баз данных для DBI также могут автоматически кодировать и декодировать, но это
иногда ограничивается кодировкой UTF-8.
Что if I не знают , которые кодирование законопроект используемый?
Сделайте все возможное, чтобы выяснить это, и, если нужно: угадайте. (Не забудьте задокументировать
угадайте с комментарием.)
Вы можете открыть документ в веб-браузере и изменить набор символов или символ.
кодирование до тех пор, пока вы не сможете визуально убедиться, что все символы выглядят так, как должны.
Невозможно надежно определить кодировку автоматически, поэтому, если люди продолжают отправлять
данные без указания кодировки, возможно, вам придется их обучить.
Может I использование Unicode in my Perl источники?
Да, ты можешь! Если ваши источники закодированы в UTF-8, вы можете указать это с помощью "use utf8"
прагма.
используйте utf8;
Это ничего не делает ни с вашим вводом, ни с вашим выводом. Это влияет только на то, как
источники читаются. Вы можете использовать Unicode в строковых литералах, в идентификаторах (но они все равно
должны быть «символами слова» согласно «\ w»), и даже в настраиваемых разделителях.
Данные :: Дампер не восстановление UTF8 флаг; is it сломана?
Нет, Unicode-возможности Data :: Dumper такие, какими они должны быть. Были некоторые
жалобы на то, что он должен восстанавливать флаг UTF8 при повторном чтении данных с помощью eval.
Однако вам действительно не следует смотреть на флаг, и ничто не указывает на то, что Data :: Dumper
должен нарушить это правило.
Вот что происходит: когда Perl читает строковый литерал, он придерживается 8-битной кодировки как
пока может. (Но, возможно, изначально он был закодирован как UTF-8, когда вы
сбросил его.) Когда он должен отказаться от этого, потому что другие символы добавлены к тексту
string, он автоматически обновляет строку до UTF-8.
Если вы правильно кодируете свои строки для вывода, все это вас не касается, и вы
может просто "eval" выгружать данные, как всегда.
почему do регулярное выражение персонаж классов иногда совпадение Важно in ASCII спектр?
Начиная с Perl 5.14 (и частично с Perl 5.12), просто добавьте "использовать функцию
unicode_strings »рядом с началом вашей программы. В пределах его лексической области видимости вы
не должно быть этой проблемы. Он также автоматически включается в разделе «использовать функцию ': 5.12'».
или "использовать v5.12" или "-E" в командной строке для Perl 5.12 или выше.
Причина в том, чтобы требовать этого, чтобы не ломать старые программы, которые
все работало до появления Unicode. Те старые программы знали только об ASCII
набор символов, и поэтому может не работать должным образом для дополнительных символов. Когда строка
в кодировке UTF-8, Perl предполагает, что программа готова работать с Unicode, но когда
строки нет, Perl предполагает, что нужен только ASCII, и поэтому те символы, которые
символы not ASCII не распознаются относительно того, какими они были бы в Unicode. "использовать функцию
'unicode_strings' "указывает Perl обрабатывать все символы как Unicode, независимо от того, является ли строка
закодирован в UTF-8 или нет, что позволяет избежать проблемы.
Однако в более ранних версиях Perls или если вы передаете строки подпрограммам за пределами функции
области, вы можете принудительно установить правила Unicode, изменив кодировку на UTF-8, выполнив
"utf8 :: upgrade ($ строка)". Его можно безопасно использовать с любой строкой, поскольку он проверяет и не
изменить строки, которые уже были обновлены.
Для более подробного обсуждения см. Unicode :: Semantics на CPAN.
почему do некоторые символы верхний регистр or в нижнем регистре правильно?
См. Ответ на предыдущий вопрос.
Как I определять if a string is a текст string or a двоичный строка?
Вы не можете. Некоторые используют для этого флаг UTF8, но это неправильное использование и заставляет хорошо себя вести.
такие модули, как Data :: Dumper, выглядят плохо. Флаг для этой цели бесполезен, потому что он выключен.
когда для хранения строки используется 8-битная кодировка (по умолчанию ISO-8859-1).
Это то, что вы, программист, должны отслеживать; извиняюсь. Вы могли бы рассмотреть
приняв своего рода «венгерскую нотацию», чтобы помочь в этом.
Как do I конвертировать от кодирование FOO в кодирование БАР?
Сначала преобразовав байтовую строку в кодировке FOO в текстовую строку, а затем текстовую строку
в байтовую строку с кодировкой BAR:
мой $ text_string = decode ('FOO', $ foo_string);
мой $ bar_string = encode ('BAR', $ text_string);
или пропустив часть текстовой строки и перейдя непосредственно от одной двоичной кодировки к
Другие:
используйте Encode qw (from_to);
from_to ($ строка, 'FOO', 'BAR'); # изменяет содержимое $ string
или позволяя автоматическому декодированию и кодированию делать всю работу:
откройте мой $ foofh, '<: encoding (FOO)', 'example.foo.txt';
откройте мой $ barfh, '>: encoding (BAR)', 'example.bar.txt';
напечатать {$ barfh} $ _ while <$ foofh>;
Что "decode_utf8" и "encode_utf8"?
Это альтернативные синтаксисы для «decode ('utf8', ...)» и «encode ('utf8', ...)».
Что is a "широкий персонаж"?
Это термин, используемый для символов, занимающих более одного байта.
Предупреждение Perl «Широкий символ в ...» вызвано таким символом. Без указания
уровень кодирования, Perl пытается уместить все в один байт. Когда он не может, он излучает это
предупреждение (если предупреждения включены) и вместо этого использует данные в кодировке UTF-8.
Чтобы избежать этого предупреждения и избежать разных кодировок вывода в одном потоке,
всегда указывайте кодировку явно, например, со слоем PerlIO:
binmode STDOUT, ": кодировка (UTF-8)";
ВНУТРЕННИЕ
Что is « UTF8 флаг"?
Пожалуйста, если вы не взламываете внутреннее устройство или не отлаживаете странности, не думайте о
Флаг UTF8 вообще. Это означает, что вам, скорее всего, не следует использовать «is_utf8», «_utf8_on» или
"_utf8_off" вообще.
Флаг UTF8, также называемый SvUTF8, является внутренним флагом, который указывает, что текущий
внутреннее представление - UTF-8. Без флага предполагается, что это ISO-8859-1. Perl
преобразуется между ними автоматически. (На самом деле Perl обычно предполагает представление
это ASCII; см. «Почему классы символов регулярных выражений иногда совпадают только в диапазоне ASCII?»
над.)
Один из внутренних форматов Perl - UTF-8. К сожалению, Perl не может
секрет, так что все об этом знают. Это источник большой путаницы. Лучше
представьте, что внутренний формат - это какая-то неизвестная кодировка, и что вам всегда нужно
кодировать и декодировать явно.
Что в отношении "использовать байты " прагма?
Не используйте это. Нет смысла иметь дело с байтами в текстовой строке, да и нет смысла
для работы с символами в байтовой строке. Сделайте правильные преобразования (по
декодирование / кодирование), и все будет хорошо: вы получите количество символов для декодированных
данные и количество байтов для закодированных данных.
«использовать байты» - это обычно неудачная попытка сделать что-то полезное. Просто забудь об этом.
Что в отношении "использовать кодировка " прагма?
Не используйте это. К сожалению, предполагается, что среда программиста и среда
пользователь будет использовать ту же кодировку. Он будет использовать ту же кодировку для исходного кода и для
STDIN и STDOUT. Когда программа копируется на другую машину, исходный код не
изменится, но среда STDIO может.
Если вам нужны символы, отличные от ASCII в исходном коде, сделайте его файлом в кодировке UTF-8 и
"использовать utf8".
Если вам нужно установить кодировку для STDIN, STDOUT и STDERR, например, на основе
языковой стандарт пользователя, "использовать открытый".
Что is разница между ": кодировка" и ": utf8"?
Поскольку UTF-8 является одним из внутренних форматов Perl, вы часто можете просто пропустить кодировку или
шаг декодирования и напрямую управлять флагом UTF8.
Вместо «: encoding (UTF-8)» можно просто использовать «: utf8», который пропускает этап кодирования.
если данные уже были представлены как UTF8 внутри. Это широко считается хорошим
поведение, когда вы пишете, но это может быть опасно при чтении, потому что вызывает
внутренняя несогласованность, когда у вас есть недопустимые последовательности байтов. Использование ": utf8" для ввода может
иногда приводят к нарушениям безопасности, поэтому используйте вместо этого ": encoding (UTF-8)".
Вместо «декодировать» и «кодировать» вы можете использовать «_utf8_on» и «_utf8_off», но это
считается плохим стилем. Особенно "_utf8_on" может быть опасным по той же причине, что и
": utf8" можно.
Есть несколько ярлыков для oneliners; см. -C в perlrun.
какой разница между "UTF-8" и "utf8"?
«UTF-8» - официальный стандарт. "utf8" - это способ Perl быть либеральным в том, что он
принимает. Если вам нужно общаться с вещами, которые не столь либеральны, вы можете
рассмотрите возможность использования "UTF-8". Если вам приходится общаться с вещами, которые слишком либеральны, вы
возможно, придется использовать "utf8". Полное объяснение находится в Encode.
«UTF-8» внутренне известен как «utf-8-strict». В учебнике последовательно используется UTF-8, даже
где utf8 фактически используется внутри компании, потому что различие может быть трудным, и
в основном не имеет значения.
Например, utf8 можно использовать для кодовых точек, которых нет в Unicode, например 9999999,
но если вы закодируете это в UTF-8, вы получите символ подстановки (по умолчанию; см.
«Обработка искаженных данных» в Encode, чтобы узнать о других способах решения этой проблемы.)
Хорошо, если вы настаиваете: «внутренний формат» - это utf8, а не UTF-8. (Когда это не какой-то другой
кодирование.)
I потерянный отслеживать; почему кодирование is в нашей внутренней среде, формат действительно?
Хорошо, что вы сбились с пути, потому что не стоит полагаться на то, что внутренний формат
любая конкретная кодировка. Но раз уж вы спросили: по умолчанию внутренний формат либо
ISO-8859-1 (latin-1) или utf8, в зависимости от истории строки. На EBCDIC
платформы, это может быть даже иначе.
Perl знает, как он хранит строку внутри, и будет использовать это знание, когда вы
"кодировать". Другими словами: не пытайтесь выяснить, какая внутренняя кодировка для определенного
строка есть, но вместо этого просто закодируйте ее в желаемой кодировке.
Используйте perlunifaq в Интернете с помощью сервисов onworks.net