2012-03-15 2 views
1

Команда file говорит мне:Как читать текст Юникода Юникода Юникода в Perl?

tmp.txt: Little-endian UTF-16 Unicode text, with CRLF line terminators

cat, head и так далее не может отобразить этот файл правильно.

Но vim может отобразить его правильно. vim говорит мне:

[~/tmp/tmp.txt] [utf-8,dos] 
"tmp.txt" [converted][dos] 

и :set в Vim говорит fileencoding=ucs-2le

Так что в Perl:

open FH,'<:encoding(ucs-2le)',$file; 
while(<FH>){ 
    chomp; 
    # A start 
    print; 
    # Perl: Wide character in print at a.pl line 12, <FH> line 1 
    # And display incorrect 
    # A end 

    # B start 
    binmode STDOUT,":utf8"; 
    print; 
    # display incorrect too 
    # B end 

} 

Как я могу прочитать этот файл правильно в Perl?

+0

Для чего это стоит, ваш код работает отлично для меня на небольшой файл, который я только что создал, который использует прямой порядок байтов UTF-16. (Мне нужно было удалить спецификацию вручную, написав 's/^ \ x {FEFF} //', чтобы предотвратить предупреждение «Широкий символ в печати», поскольку UCS-2 не использует спецификацию.) – ruakh

+0

Are вы уверены, что ваш терминал ожидает UTF-8? – cjm

+0

'locale' является' en_US.UTF-8', ': set' в vim' termencoding = utf-8', SecureCRT также utf8 – everbox

ответ

3

Я считаю, что ваша проблема будет решена либо с помощью '<:encoding(UTF-16)', либо '<:encoding(UTF-16LE)'. Сначала я бы попробовал первое; это то, что вам нужно, если файл имеет маркер байтового байта (BOM). Вероятно, есть спецификация, и это то, что отключает ваш скрипт. ucs-2le - более старый формат, похожий, но не тот же.

Для получения дополнительной информации:

Perl file encoding

Perl Encode

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