[PHP-users 3523] Re: xml_parseを使う場合の XML ファイルの文字コード

Ryuzi Kambe php-users@php.gr.jp
Wed, 14 Nov 2001 14:50:48 +0900


>  私の場合は入力する XML は全部 EUC に統一し、読み込んでから
> UTF-8 に変換してます。EUC のままで試したこともありましたが
> 結局 UTF-8 にしました。 理由はだいぶ前なので忘れてしまいま
> したが(^^; あまりたいした理由じゃなかったと思いますが。
> とりあえずこれでうまい事いってるという例で(^^;

>   xml_parse( $parser, i18n_convert( $data, "UTF-8", "EUC-JP" ), feof( $xmlfp ) ) ;
この部分ですね。PHPのXML拡張機能にはソースエンコーディングと
ターゲットエンコーディングがあり、
http://php3.de/manual/ja/ref.xml.php#xml.encoding
によると
「ターゲットエンコーディングは、PHPがデータをXMLハンドラ関数に 渡す時に
行われます。あるXMLパーサが作成された際、ターゲットエン コーディングは、
ソースエンコーディングと同様に設定されます。」

とあるので、上のやり方をやらないと両方EUCになって上手くいかないのかも
しれないですね・・・でも、「 PHP におけるドキュメントの内部表現は、
常に UTF-8でエンコードされます。」とも書いてあるので、上のように
文字コードを変換しなくても、自動でやってくれるのかもしれません。

真偽を確かめるには、ドキュメントの作者か、ソースコードを見るしかなさそう
ですね。

> ところで、PHP マニュアルのサンプルですと、XMLファイルの読み込み
> では fread で読み込んでるのですが、このまま使用すると途中で
> parse error になってしまいます。丁度 4096 文字の区切り目が文字
> 列の途中だったりするとうまく解析出来ないのでしょうか?
> 
> とりあえず fgets にして1行づつ処理して逃げてます。
> 
> 他の方で fread でうまく処理出来ている方がいらっしゃいましたら
> コツをお教え頂ければありがたいのですが。

私もそのうち同じ問題につきあたるのかもしれません・・・(^^;

また、DOMXMLの方でもxmldocfileを使って読み込んでみたのですが、
上手くいきません。

どうやら、内部エンコーディング=読み込むファイルのエンコーディング
でないといけないようです。

mbstring.internal_encoding = EUC-JP
のときには、XMLファイルがEUC-JP
mbstring.internal_encoding = UTF-8
のときには、XMLファイルがUTF-8でないと読み込んだ結果が文字化けしました。
(パージングに失敗はしません)
(expatの方は内部エンコーディングがEUC-JPのときはどちらでもOK,
 UTF-8のときにどうなるかはやっていません。)

XML宣言のときにencoding属性を指定しても、パーザの方で
解釈してはくれないようです。

日本語のようにいくつもエンコーディングがあるものは、
本当に設定が面倒くさいですね。或いは、パーザがもっと
賢く処理してくれれば助かるのですが、

とりあえずは、domxmlを使うディレクトリだけ、.htaccessで
内部エンコーディングをUTF-8にすることでしのごうかと思います。

あと、現在のAPIではネームスペースを扱うのもちょっと難しいそうですね。

--
Ryuzi Kambe
kambe@mc.kcom.ne.jp