Wide character in print at
原因
Wide character in print at というエラーは UTF-8 フラグが付いた文字列を print しようとしているからである。
http://www.ksknet.net/perl/wide_character.html
対策
UTF-8 フラグを取り外してから print すればエラーがでなくなります。
判別方法
UTF-8 フラグが付いているかどうかは utf8::is_utf8 を使用すればよい。
print utf8::is_utf8($string) ? 'flagged' : 'no flag';
解決方法
UTF-8 フラグが付いていたら、encode を使用してフラグをはずします。以下の例では $string を utf-8 に変換して出力します。
print encode('utf-8', $string);
utf8::is_utf8 について
UTF8 フラグのついた文字列というのは Perl の内部的なもの(Perl プログラム本体の内部で処理するデータ)であって、Perl の外に出すためのもの(Perl プログラムが出力するためのデータ)ではありません。
http://www.rwds.net/kuroita/program/Perl_unicode.html#perlio
また、Perl の外から Perl の中に入ってくるもの(Perl プログラムへ入力されるデータ)も、Perl の内部的なものとは違います。
すなわち、標準出力、ファイルへの出力は、Perl の内部的なものを出しては駄目で、標準入力、ファイルからの入力では、Perl の内部的な文字列とは違うものが入ってきます。
()内の文字は筆者追加
utf8::is_utf8 は、Perl 本体で処理する際にフラグが付加されているかどうかを判断する。
では、
utf8::* な関数は use しなくても使えます。use すると別の意味になってしまう
に記載されている「別の意味」とは何か?
に記載されているので参考にする。まとめようとしたが、重要な注意事項も書かれているので、詳細はリンクを見ることにする。