2013-05-10 3 views
2

У меня есть проблемы с utf8::encode при использовании прагма use open qw(:std :utf8);Как использовать utf8 закодировать с открытой прагмой

Пример

#!/usr/bin/env perl 

use v5.16; 
use utf8; 
use open qw(:std :utf8); 

use Data::Dumper; 

my $word = "+банк"; 
say Dumper($word); 
say utf8::is_utf8($word) ? 1 : 0; 

utf8::encode($word); 
say Dumper($word); 
say utf8::is_utf8($word) ? 1 : 0; 

Выход

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}"; 
1 
$VAR1 = '+банк'; 
0 

Когда я удалить эту прагму use open qw(:std :utf8); , все в порядке.

$VAR1 = "+\x{431}\x{430}\x{43d}\x{43a}"; 
1 
$VAR1 = '+банк'; 
0 

Благодарим вас за продвинутый!

+0

Использование ': станд: utf8' добавляет слой UTF-8 в' STDOUT'. Поэтому последний 'say' попытается еще раз закодировать' $ word' .. –

ответ

6

Если вы собираетесь заменить utf8::encode($word); на номер use open qw(:std :utf8);, вам действительно нужно удалить utf8::encode($word);. В версии, которая не работает, вы кодируете дважды.

2

utf8 :: encode is не Что вы хотите, если собираетесь печатать на дескриптор файла, на котором perl ожидает вывода utf8.

utf8 :: encode говорит, возьмите эту строку и дайте мне строку, где каждый символ является байтом кодировки utf8 входной строки. Обычно это делается только тогда, когда вы собираетесь использовать эту строку каким-то образом, когда perl не будет автоматически преобразовываться в utf8, если это необходимо.

Если добавить say length($word); после кодирования, вы увидите, что $ слово 9 символов, а не оригинал 5.

Смежные вопросы