2011-02-10 2 views
1

私はさまざまなソースからさまざまなXMLファイルを受け取るこのプロジェクトで取り組んでいます。私のPHPスクリプトはそれらを読んで解析し、mysqlデータベースに格納する必要があります。PHP:単純なXMLと異なるコードページとデータの正確な取得

XMLファイルを解析するには、PHPでSimpleXMLElementクラスを使用します。ベルギーからUTF-8エンコーディング、ドイツからiso-8859-1エンコーディング、チェコ共和国からcp1250などのファイルを受け取ります。

xml-dataをSimpleXMLElementに渡してこのオブジェクトでasXML()を実行すると、元のxmlファイルと同じようにxmlデータが正しく表示されます。 フィールドをPHP変数に割り当ててこの変数を画面に表示しようとすると、テキストが壊れて見えますが、もちろんmysqlデータベースに挿入すると壊れてしまいます。

例:

XML:

<?xml version="1.0" encoding="cp1250"?> 
... 
<name>Labe Dìèín - Rozb 741,85km ; Dìèín - Rozb 741,85km </name> 
... 

PHPコード:(Linuxのbashシェル上の)コードの

$sxml = file_get_contents("test.xml"); 
$xml = new SimpleXMLElement($sxml); 
//echo $xml->asXML() . "\n"; // content will show up correctly in the shell 
$name = (string)$xml->ftm->fairway_section->geo_object->name; 
echo $name . "\n"; 

結果は上向きカーソルを移動した後、印刷:BAN - Rozb 741,85km;私はPHPがそのデータを文字列パラメータに格納するためにそのデータをUTF-8に変換すると思うので、mb_convert_encodingを使用していると仮定しています(PHPで印刷された間違った文字にカーソルの動きが関係しています) UTF-8からcp1250への変換は正しい結果を示しますが、そうではありません。また、他のすべてのソースと組み合わせ可能な形式でデータを格納できるはずです。

私はエンコード/コードページについてよく分かりませんが、これはおそらく私が正しく動作するようにはできませんが、私が知っていることは、例えば、異なる言語のテキストを新しいUltraEditファイル、それらのすべてが正しく表示されます。 UltraEditはどのようにこれを処理しますか?

ソース上のどのようなエンコーディングでも、常にデータが表示されるようにデータを変換するにはどうすればよいですか?UTF-8を使用していますか?代わりに

答えて

2

てみiconv

$str = iconv('UTF-8', 'WINDOWS-1250', $str); 
+0

はい、これはトリックです。違いはなんですか? – scippie

0

問題は、あなたの入力ファイルが不正な形式です。 Windows-1250にはì(ラテン小文字I、墓地あり)の文字はありません。 hereを参照してください。

最も近い文字はU+00ED(ラテン小文字I私は急性である)です。

このような文字がシェルに正しく表示されていることは、おそらく偶然である可能性があります。