- ベストアンサー
dbmopenでutf8環境にハマっている理由と解決法
- dbmopenを使用して保存した値が表示時に文字化けしてしまう原因は、保存時に文字化けしているためです。
- 解決方法としては、保存時にutf8のエンコードを行うことで文字化けを防ぐことができます。
- また、DataDumperを使用してデータを保存し、読み出す方法もあります。しかし、tieを使用しても同様に文字化けする可能性があります。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
何をやろうとしているのか不明だけど、とりあえず。 #!/usr/bin/perl use strict; use warnings; use utf8; use Encode; my $key1 = 'test'; my $key2 = 'test2'; my $val1 = 'あああ'; my $val2 = 'いいい'; my $file = "utf8DB2"; open my $fh, '>', $file or die "$!:$file"; binmode $fh, ':encoding(utf8)'; print {$fh} "$val1\n"; print {$fh} "$val2\n"; close $fh or die "$!:$file"; dbmopen my %hash, $file,, 0666 or die "$!:$file"; $hash{$key1} = Encode::encode_utf8($val1); $hash{$key2} = Encode::encode_utf8($val2); dbmclose %hash or die "$!:$file"; # cp932 = Windows shift-jis my $locale='cp932'; dbmopen my %dbm, $file, 0666 or die "$!:$file"; for my $key ( keys(%dbm) ) { my $val = $dbm{$key}; Encode::from_to( $val, 'utf8', $locale ); print "key2 : $key val : $val\n"; } dbmclose %dbm or die "$!:$file";
お礼
ご教授頂き、ありがとうございます。 下記perlのバージョン2つで確認してみたのですが、 $ perl -v This is perl, v5.8.9 built for i686-linux $ perl -v This is perl, v5.10.0 built for i386-linux-thread-multi の $ locale LANG=ja_JP.UTF-8 で、の環境で確認してみたのですが、 お教え頂いた内容を適切に修正し実行してみましたが、何故か文字化けしている状況です。 かなりハマっていたのですが、ふいに 自分のテストバージョンの方で #use utf8; #use open ":utf8"; #use open ":std"; とコメントアウトし作成したファイルを一旦削除する事で文字化けを起こさず表示確認する事が出来ました。 その状況で ご教授頂いたスクリプトの方を、 my $locale='utf8'; と修正しているのですが、こちらの方は文字化けをする状況です。 しかし、望んでいる形を実現出来ましたので、解決と致したいと存じます。 毎度ご教授頂きありがとうございます。