сдвиг JIS декодирование / кодирование в Perl - PullRequest
2 голосов
/ 02 апреля 2011

Когда я пытаюсь декодировать строку, закодированную в shift-jis, и кодировать ее обратно, некоторые символы искажаются: У меня следующий код:

use Encode qw(decode encode);
$val=;
print "\nbefore decoding: $val";
my $ustr = Encode::decode("shiftjis",$val);
print "\nafter decoding: $ustr";
print "\nbefore encoding: $ustr";
$val = Encode::encode("shiftjis",$ustr);
print "\nafter encoding: $val";

, когда я использую строку: hello ソ world in inputон корректно декодируется и кодируется обратно, то есть перед декодированием и после кодирования печатает в вышеприведенном коде и печатает то же значение.Но когда я попробовал другую строку, такую ​​как: 100

Конечный вывод искажен.

Это специфическая проблема для Perl-библиотеки или общая проблема с отображением jis-карт?Есть ли какое-то решение для этого?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2011

Вы должны просто заменить shiftjis на cp932.

http://en.wikipedia.org/wiki/Code_page_932

2 голосов
/ 02 апреля 2011

Вам не хватает проверки ошибок.

use utf8;
use Devel::Peek qw(Dump);
use Encode qw(encode);

sub as_shiftjis {
    my ($string) = @_;
    return encode(
        'Shift_JIS',    # http://www.iana.org/assignments/character-sets
        $string,
        Encode::FB_CROAK
    );
}

Dump as_shiftjis 'helloソworld';
Dump as_shiftjis 'ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ';

Вывод:

SV = PV(0x9148a0) at 0x9dd490
  REFCNT = 1
  FLAGS = (TEMP,POK,pPOK)
  PV = 0x930e80 "hello\203\\world"\0
  CUR = 12
  LEN = 16
"\x{2160}" does not map to shiftjis at …
...