"Wide character in print at xmlParse ・・・"


perlであるXML文書を処理して出力しようとしたらこんなエラーが出た。


出力の文字化けとWide characterというキーワードで2バイト文字、要は日本語の処理のエラーなんだろうなと予想はついた。


処理対象のXML文書の文字コードはutf-8。


調べてみるとありました。


対処コードは


utf8::is_utf8($string) ? utf8::encode($string) : ''';


文字列にUTF-8フラグが付いているとutf8::is_utf8($string) はtrueを返すのでutf8::encode($string)でエンコードしてUTF-8フラグを外します。


再度実行してみたらエラーは消えました。


だけど、肝心の文字化けが消えてねえ!!



新しい言語を使用する時で最初に面倒に感じるのがいつも文字化けの対処。


日本語ウザい。


とりあえず文字化けの問題は後回しだす。



[追記]

あれから少し調べた結果、文字化けの問題が解決したので追記です。


utf8::encode()関数について勘違いしてました。


utf8::encode()関数でエンコードしてUTF-8フラグを外します。って書きましたけど、この関数にはエンコード機能はありません(゜д゜;)


なので、utf8::encode()でUTF-8フラグを外してからfrom_to($string, 'UTF-8', 'Shift_JIS')でエンコードしてあげなければなりません。


この例では$stringをUTF-8からShift_JISに変換します。


逆に、from_to()でエンコードするときに対象の文字列にUTF-8フラグがついているとうまくエンコードできないようです。


要はこのニ行が必要でした。

utf8::encode($string);

from_to($string, 'UTF-8', 'Shift_JIS');

(*宣言文に、use Encode qw/ from_to/;が必要。)


また、上の二行は下の一行で纏めてできます。

$string= encode('Shift_JIS', $string);

(*宣言文に、use Encode qw/ encode /;が必要。)


やれやれ、これで胸の痞えがとれました