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

Junichi Kuroki php-users@php.gr.jp
Wed, 14 Nov 2001 15:50:46 +0900


 黒木です。

> >   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拡張機能は ソースエンコーディングとターゲットエンコーディングがある
・ソースエンコーディングは生成したXMLパーサで構文解析を行う時に実行される
・ソースエンコーディングは、ISO-8859-1 と、UTF-8 と、US-ASCII の3つを
 サポートする
・ソースエンコーディングは XMLパーサ生成時に指定する

 というわけで、ソースエンコーディングに EUC を指定出来ないので、EUC から
UTF-8 に変換して解析するという事で、UTF-8 でパーサを生成し、

$parser = xml_parser_create( "UTF-8" ) ;

生成したパーサで構文解析を行う時に文字コード変換を行えばいいという事になると
思います。

xml_parse( $parser, i18n_convert( $data, "UTF-8", "EUC-JP" ), feof( $xmlfp ) ) ;

・ターゲットエンコーディングは、PHP が構文解析を行い、各ハンドラにデータを
 渡す際に実行される
・ハンドラ内にデータを渡された時点でデータの文字コードは UTF-8 に変換されて
 いる。という事はターゲットエンコーディングは UTF-8 になる?

 というわけで、ハンドラ内では UTF-8 から EUC に変換して使用すればいいという
事になるのではないかと思います。

function startElement( $parser, $name, $attribs ) {
  $name = i18n_convert( $name, "EUC-JP", "UTF-8" ) ;
  hoge( $name ) ;
}

という風に、全部 EUC にしておいて、処理する部分だけこのように変換を行えば
問題なさそうだと思うのですが、実験する時間が今のところ無いのでとりあえず
書くだけ書いておきます(^^;

ちなみに、domxml の方は将来仕様が変わる可能性があるという事なので全く手を
つけずに独自フォーマット(甘美な響きだ(笑))で処理してます。 解析した後は
多次元連想配列の中に格納してるので情報の取り出しはものすごく直感的かなと
思います。でもものすごく長ったらしいソースになります(笑)

dom っぽいけど嘘の dom という事で Fake dom と勝手に呼んでます。これで情報
検索がメモリ上とDB上で可能になればものすごく快適な XML アクセスが出来る様
になるのですが今のところ苦戦してます。 全部 PHP で処理してるのでものすご
く処理は重たいのがネックになっています。

$name = fdom["名簿"]["10000"]["名前"] ;
$adrs = fdom["名簿"]["10000"]["住所"] ;
$teln = fdom["名簿"]["10000"]["電話番号"] ;

(: )('')( :)(..)(: )('')( :)(..)(: )('')( :)(..)

  黒木淳一 : kuroki@mycc.co.jp
  P.S.R.C.  http://www.chamise.jp/mera/index.html

(..)( :)('')(: )(..)( :)('')(: )(..)( :)('')(: )