キッズプレート、パスタおかわり

プログラミングやデジモノについてあれこれ
--.--.-- --:--|カテゴリ:スポンサー広告| コメント(-)

スポンサーサイト


上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2007.04.18 17:58|カテゴリ:Perlコメント(2)

WindowsのUTF-16出力で文字化けが発生する


 多くの方が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の書き出しが出来るじゃないか。さっそく機会があったらためしてみようっと。
素敵

ありがとうございます
[ 2009/07/09 13:26 ] [ 編集 ]
いえいえ
お役に立てましたか? 文字コードってやっぱ大変。
英語圏の人がうらやましー
[ 2009/07/10 00:41 ] [ 編集 ]
コメントの投稿












管理者にだけ表示を許可する
トラックバック
この記事のトラックバックURL

プロフィール

ひらくん Author:ひらくん
どもども、ひらんくんどす。
日々まったり過ごしております。
仕事はDTP関連のスプリクト&アプリケーション開発。
Follow happyscript on Twitter

ブログ内検索



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