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

Presented by Nishishi via Movable Type. Last Updated: 2022/03/25. 10:40:18.

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は書けません。(書くと投稿が拒否されますのでご注意下さい。)

※ご投稿頂いた内容は、掲載前に管理者が確認する設定にしている場合があります。たいていは数日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

著者紹介


にしし(西村文宏)

にししでございます。本書いたり記事書いたりしてます。あと萌えたり。著書5冊発売中です(Web製作系4冊+小説1冊)。著書や記事は「西村文宏」名義。記事は主にAll Aboutで連載。本の最新刊は2011年3月に発売されたライトノベルでございますよ。

Twitter:にしし/西村文宏
にしし/西村文宏 on facebook にしし/西村文宏 on mixi フォローはお気軽に!

にしし(西村文宏)連絡先
☕ コーヒーをおごる

著書一覧と詳細

にししふぁくとりー Sakura scope内限定での主要なカテゴリ

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