にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2015/09/22. 13:23:46.

XML::Simpleは問答無用でUTF-8に変換しちゃうんですかね?

文字コード、なかなか扱いが難しいですね…。

XML::Simpleを使ってXMLを読んだり書いたりするCGIを作ったんですけど、XML::Simpleは、問答無用で文字コードをUTF-8に変換しちゃうのですね。読み込み元の文字コードが何であっても。

SHIFT-JISで書かれてるXMLを、XML::Simpleを使って読み込んでハッシュにしてみたら、中身がUTF-8になってました。最終的にSHIFT-JISで文字列を得たいので、Jcodeを使ってUTF-8な文字列をSHIFT-JISに変換するんだけど、最終的にXML::Simpleを使ってXMLを出力するので、結局そこでまたUTF-8になっちゃうのですよね。(笑)

XML::Simpleを使う限り、文字コードはUTF-8じゃないとダメだということにして、UTF-8をベースにCGIを作った方がいいのかな…。^^;;;

Jcode(Jcode.pm)を使えば、次のように記述することで文字コードを自由自在に変換できる…はずだと思うのですが。

Jcode->new($string)->sjis;

上記だと、$string変数に含まれる文字列をSHIFT-JISに変換するという処理になる…はずだと思うのですが。どうも、XML::Simpleでハッシュに分解された文字列に対して上記のコードを実行しても、文字コードがさっぱり変換されない気がします。変換先がSHIFT-JIS(sjis)以外でも。

なんでだろう?と思って、Jcodeのgetcode関数を使って、XML::Simpleが分解した文字列の文字コードを調べてみました。ソースは次のような感じ。

Jcode::getcode($string);

すると、なぜか、「ASCII」という答えが返ってきます。^^;;;
表示させると明らかにUTF-8で記述された文字列なんですけど、なぜがgetcode関数はASCII文字列だと判断するのですよね。

これが原因で、文字コードの変換が行われないんだろうなーと推測します。(元の文字列がASCIIなら、変換先がSHIFT-JISだろうがEUC-JPだろうが、全部一緒ですから。)

仕方がないので、Jcodeのconvert関数を使って、変換元文字コードと変換先文字コードの両方を指定すれば、とりあえず目的の変換結果は得られました。
下記は、UTF-8で書かれた文字列$stringをSHIFT-JISに変換するソース。

$string = Jcode::convert( $string , "sjis", "utf8" );

しかし、どーもスマートじゃない気がするんですよね…。^^;;;

今回必要なのは、自前のCGI用のデータファイル(XML)を読み書きするだけなので、最初から文字コードはUTF-8限定!と決めてしまえば、ずいぶん楽になるのかも知れませんが。^^;;;
でも、いろんな環境で使われることを考慮するなら、やっぱり他の文字コードにも対応できてる方が望ましいですよね。^^;
というわけで、Jcodeでごにょごにょしてなんとかしたいんだけど。^^;

最初から文字コードを考慮してソースを書くと、なんか本題の処理以外の部分の処理が多くなっちゃいそうな感じなので、今は、データはASCII文字だけ!と決めちゃって、先にCGIを完成させようかと思ってます。

んで、最後に必要な文字コードの変換処理なりを追加する…と。

XML::SimpleがUTF-8に決め打ちせずに、他の文字コードでもうまく使えてくれれば楽なんだけどなあ。
XML::Simpleが問題なのか、それともXML::Simpleから呼び出されるXML::Parserが問題なのか分かりませんけど。

まあ実は、頑張ってXML::Simpleを使わなくても、正規表現で軽く抜き出せるくらいのシンプルなXMLなんで、正規表現でやってもいいんですけどね。^^; 正規表現の方が圧倒的に速度は高速だろうし。
でもまあ、拡張することを考えたり、後学のために(^^;)、XML::Simpleを使おうかなと。
あとどうせ、RSSを生成するのにXML::RSSを使うつもりだし。…それはあんま関係ないか?^^;

まあとにかく、文字コードはなかなか一筋縄にはいかんなあ、という話。
私の考え方(アルゴリズム~モジュールの選択など)がおかしいのかも知れませんけど。(その可能性の方が高いな。^^;)

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---