NetSago
Вход
Войти

Как присоединиться?
Меню
Главная
События
 Заметки
Статьи
Теги
Поиск
О Проекте
Ссылки
Наше
RSS События по RSS
RSS Заметки по RSS
netsago NetSago
Популярное
Руководство по получению прибыли от Свободных и Открытых Проектов by Джон Эндрюс

Восстановление удаленных текстовых файлов в ФС ext3 by scamelscrud

Заметки — Используем UTF-8 в PERL.
Назад в Заметки

Используем UTF-8 в PERL.
scamelscrud



Теги: perl utf-8



Первый способ:
Используем опцию -C интерпретатора perl.

/usr/bin/perl -CSDA - включает UTF-8 на всех интерфейсах и для всех данных поступающих в ARGV.
/usr/bin/perl -CSDAL - то же самое, но только при условии, что UTF-8 - кодировка текущей локали.

Неудобно. На моём опыте perl часто ругался на указание этой опции в первой строке запускаемого файла.

Второй способ:
Те же самые опции имеют свои числовые аналоги. Их можно указать в переменной окружения PERL_UNICODE. Используем числовые значения, для упомянутых выше комбинаций букв с опцией C (63 - для SDA, 127 для SDAL)
PERL_UNICODE=63 включает UTF-8 на всех интерфейсах и для всех данных поступающих в ARGV.
PERL_UNICODE=127 - то же самое, но только при условии, что UTF-8 - кодировка текущей локали.

Опять же, неудобно, на мой взгляд.

Третий способ:
Попробуем всё же добиться этого же эффекта в рантайме.

Используем прагму open, для того, чтобы переключить интерфейсы ввода/вывода на UTF-8.

use open IO => ':utf8';
#Это аналогично:
#use open ':utf8';


Сабпрагма :utf8 говорит perl о том, что входные и выходные данные представлены в UTF-8.

use open ':std';

Эта сабпрагма открывает STDIN, STDERR и STDOUT в выбраной кодировке (в случае с utf8, очевидно, включается так же binmode)

Кроме того, если кодировка локали UTF-8, то можно вместо двух предыдущих сабпрагм воспользоваться:

use open ':locale';

Эта сабпрагма определяет кодировку локали. Дальше выстовляется кодировка входных/выходных данных и открываются STDERR, STDIN и STDOUT в этой кодировке.

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

BEGIN {
require Encode;

foreach (@ARGV) { Encode::_utf8_on($_); }
}



Cкрипт для примера мог бы выглядеть так:

#!/usr/bin/perl

use strict;
use utf8; #Не забываем и про эту прагму. Она сообщает пёрлу о том,
#что исходник написан в utf8

use open ':utf8';
use open ':std';
#или use open ':locale';

use Encode;
foreach (@ARGV) { Encode::_utf8_on($_); }

my $argument = shift; #Первый аргумент из @ARGV
print "ARGUMENT: ". ($argument || "None"). "\n";
print "Enter something in UTF-8: ";
my $stdin = join('', ); #Получаем данные из STDIN
print "You entered: ". $stdin. "\n";
#Ну и похардкодим что-нибудь до кучи
print "Hardcoded data: \n";
print "\x{263A}\n"; #Смайлик:)
print "\x{b2}\n"; #Степень двойки


UTF-8 и CGI.pm:
Если вы используете модуль CGI.pm, то данные полученные через CGI (не важно POST или GET метод исползовался) CGI.pm вернёт вам данные в кодировке iso-8859-1. Исправляется одной строчкой:

my $param = $cgi->param('test');
$param = Encode::decode_utf8($param); #Теперь всё в порядке


Info:
perldoc perlrun
perldoc open
perldoc PerlIO
perldoc perlunicode
perldoc Encode
perldoc utf8
Язык
English/Английский
Поиск
Расширенный Поиск
Ошиблись?
Если вы обнаружили ошибку на сайте, пожалуйста, сообщите нам о ней.
Посчитали
4 / 150
К нам сегодня зашли 4 робота. Они хотят убить всех человеков.

Зарегистрированных пользователей: 0
Онлайн: 0

Время генерации: 0.010 с
NetSago.v2.β © [2006;∞)  Neunica