Wide character in print at ...

2010年11月18日に持ち込まれた謎

Windowsperlを動かす。

  • piyopiyo.pl(utf-8
    • use Encode;
    • use utf8;
    • use open IN => ":utf8";
    • binmode STDOUT, ":encoding(cp932)";
  • bbb.txt(Shift_JIS
    • はじめまして。
    • はじめません。
    • はじらいます。
    • …みたいな日本語文がぞろぞろ入ってる。


piyopiyo.plでbbb.txtを読み込み、いろいろやってからファイルにShift_JISで書き出したいだけ。
ただそれだけ。

"いろいろやる"の部分にマッチングとかもあるので、最初にUTF-8にしとく。

open(IN, "bbb.txt") or die "$!"; #これはshiftjis
while ( $line = ) {
Encode::from_to($line, "shiftjis", "utf8");

#ごにょごにょしてから書き出す

}
close(IN);

さて、Shift_JISに戻してファイルに書き出すぞ〜と思ったら…

Wide character in print at ...

よくみるあいつです。
別に問題ないんけど、標準出力にいろいろ出したかったので、だだだーっとあいつが現れると困る。

UTF8フラグを落としてしまおう。

"\x{0081}" does not map to cp932 at ...

UTF8フラグは落とせるけど、おもわしくない事態に。
じゃあ$lineをShift-JISにしちゃおう、と思ったらどうやってもできない。

最終的に落ち着いた解決策は、ファイルをopenするときに文字コードを指定してしまおうというやつ。

open (OUT, ">:encoding(shiftjis)","ccc.txt") or die "$!";

いまいちすっきりしない!