В каких случаях кодирование/декодирование utf8 хрипит?

Этот скрипт дает мне два раза один и тот же вывод. Существуют ли кодировки, которые не переживут utf8 encode и decode между двумя say?

#!/usr/bin/env perl
use warnings;
use 5.16.1;
use Encode qw/encode decode/;

my $my_encoding = 'ISO-8859-7';
binmode STDOUT, ":encoding($my_encoding)";

my $var = "\N{GREEK SMALL LETTER TAU}";
$var .= "\N{GREEK SMALL LETTER OMEGA WITH TONOS}";
$var .= "\N{GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA}";

$var = encode( 'utf8', $var );
$var = decode( $my_encoding, $var );

say $var;

my $test = encode( 'utf8', $var, Encode::FB_CROAK );
$var = decode( 'utf8', $test, Encode::FB_CROAK  );

say $var;

person sid_com    schedule 05.10.2012    source источник


Ответы (1)


Он хрипит, если вы пытаетесь закодировать что-то, что выходит за пределы набора символов целевой кодировки.

utf8 — это специфичная для Perl кодировка, используемая Perl для хранения 72-битных символов. Он похож на UTF-8, но отличается. Он поддерживает все символы, поддерживаемые Perl, поэтому он никогда не сдохнет.

С другой стороны, если бы вы использовали UTF-8, он бы хрипел, если бы вы попытались закодировать что-то, что не является символом Unicode (например, chr(0x200000)).

См. также: :encoding(UTF-8) против :encoding(utf8) против :utf8

person ikegami    schedule 05.10.2012
comment
Если бы я написал utf-8, каким был бы ответ относительно другой кодировки? - person sid_com; 05.10.2012
comment
Я не понимаю вопроса. - person ikegami; 05.10.2012
comment
кодирование-декодирование с одной и той же кодировкой всегда должно работать, если кодирование работает. Возможно, вы не получите именно то, с чего начали, но я не знаю, когда вы этого не сделаете. - person ikegami; 05.10.2012
comment
Надеюсь, я понял: я начинаю с символов (декодированных), а символы, которые могут быть закодированы с помощью другой кодировки, являются подмножеством символов Unicode. Так что только бинарные данные могут это прохрипеть. - person sid_com; 05.10.2012
comment
В случае utf8 набор символов является надлежащим надмножеством Unicode. - person ikegami; 05.10.2012
comment
Re, Так что только бинарные данные могли это каркать., что это? - person ikegami; 05.10.2012
comment
двоичные данные не имеют определения, но они не будут работать ни для какой последовательности байтов. Они будут обрабатываться как U+0000..U+00FF (поскольку байты 00..FF == символы 00..FF), все они существуют. - person ikegami; 05.10.2012
comment
Что вы использовали. Какой вклад вы дали, в частности? Какую ошибку вы получили? Да ладно, тебе лучше это знать. - person ikegami; 06.10.2012
comment
Я использовал DBI/DBD::SQLite с включенным sqlite_unicode. Нет, с отключенным sqlite_unicode это работает. Ошибка была в неправильном формате символа UTF-8.... - person sid_com; 06.10.2012
comment
это не кодирование кваканье. Это из самого Perl, потому что SQLite создал поврежденный скаляр (в результате вашего запроса) - person ikegami; 07.10.2012