• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:今更ながらdbmopenでutf8環境にハマってます。)

dbmopenでutf8環境にハマっている理由と解決法

このQ&Aのポイント
  • dbmopenを使用して保存した値が表示時に文字化けしてしまう原因は、保存時に文字化けしているためです。
  • 解決方法としては、保存時にutf8のエンコードを行うことで文字化けを防ぐことができます。
  • また、DataDumperを使用してデータを保存し、読み出す方法もあります。しかし、tieを使用しても同様に文字化けする可能性があります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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";

taku0
質問者

お礼

ご教授頂き、ありがとうございます。 下記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'; と修正しているのですが、こちらの方は文字化けをする状況です。 しかし、望んでいる形を実現出来ましたので、解決と致したいと存じます。 毎度ご教授頂きありがとうございます。

関連するQ&A