3

shift-jis でエンコードされた文字列をデコードして再度エンコードしようとすると、一部の文字が文字化けします: 次のコードがあります:

エンコードqw(デコードエンコード)を使用します。
$val=;
print "\nデコード前: $val";
my $ustr = Encode::decode("shiftjis",$val);
print "\nデコード後: $ustr";
print "\nエンコード前: $ustr";
$val = Encode::encode("shiftjis",$ustr);
print "\nエンコード後: $val";

入力で文字列 : hellosoworld を使用すると、適切にデコードされてエンコードされます。つまり、デコード前とエンコード後に上記のコードで同じ値が出力されます。しかし、次のような別の文字列を試したとき:ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ

最終出力が文字化けしました。

それは perl ライブラリ固有の問題ですか、それとも一般的なシフト jis マッピングの問題ですか? それに対する解決策はありますか?

4

2 に答える 2

3

shiftjisをに置き換えるだけですcp932

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

于 2011-04-02T12:42:34.057 に答える
2

エラーチェックが不足しています。

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 …
于 2011-04-02T08:16:40.360 に答える