2 Comments
 多くの方がWindows上でPerlを使うさいにActivePerlを使用していると思います。私もその一人ですがちょっと前大きな問題に直面しました。
「UTF-16出力すると文字化けが発生する!」
 そうなんです。過去の記事で日本語の扱いについて紹介しました。じつは、あれらの設定でMac OS X 等で処理しているぶんには問題ないのですがWindows上でActivePerlを使って出力すると特定の文字が化けてしまいます。
 特定の文字というのは「上」等の文字コードの中に「0A」なんていうバイナリーデータを含んでいる文字です。
use utf8;
binmode STDOUT, ":encoding(cp932)";
binmode STDERR, ":encoding(cp932)";
binmode STDIN, ":encoding(cp932)";

#-書込先ファイルの文字コードを指定
open(OUT, ">:encoding(UTF-16LE)", "write.txt");

print OUT "\x{FEFF}"; #-BOMを出力
print OUT "上\n";
close(OUT);
exit;
 上記のサンプルコードを実行し出力された「write.txt」の中身を16進ダンプすると、
「FFFE0D0A4E0D0A00」
 となっており化け化けです。まあこんなページをご覧の方ならお察しの通り改行コードがらみの処理がどーもうまくいっていないようです。
 この現象に初めて出会った時は原因を調べる時間もなく「utf8」で出力して「nkf」でUTF16にするなんてことをしていました。
 そして月日は流れ・・・リベンジです(>Д<)ゝいぇい!
 少々時間ができたので文字化けの原因を調べてみました。そしてついに発見Σ( ̄□ ̄;)!!
Writing a Unicode file via perl
 どうやらここの内容を見るに、
「デフォルトで働いてしまう改行変換を「:raw」を指定することで抑止しUTF-16にしてから改行を自分できちんと変換しましょう」
 ということのようだ。ということでサンプルスクリプトの書き込みファイルオープンの部分を以下のようにしてみた
open(OUT, ">:raw:encoding(UTF-16LE):crlf:utf8", "write.txt");
 おぉー、ばっちり。これでWindowsのPerlからUTF-16LEの書き出しが出来るじゃないか。さっそく機会があったらためしてみようっと。
ひらくん
Posted byひらくん

Comments - 2

There are no comments yet.
t98907  

素敵

ありがとうございます

2009/07/09 (Thu) 13:26 | EDIT | REPLY |   
ひらくん  
いえいえ

お役に立てましたか? 文字コードってやっぱ大変。
英語圏の人がうらやましー

2009/07/10 (Fri) 00:41 | EDIT | REPLY |   

Leave a reply

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。