1

PHP で UTF-16 エンコーディングの XML ファイルを生成しようとしていますが、生成されたファイルを開くときに問題が発生します。DOMDocument を使用してファイルを作成します。UTF-8 エンコーディングでは問題ありません。Notepad++ で XML ファイルを開くと、次のようになります。

<?xml version="1.0" encoding="UTF-16"?>਍㰀伀䈀㸀ഀ
<CLIENT>਍    㰀䈀伀䴀㸀ഀ
  <BO>਍        㰀䄀搀洀䤀渀昀漀㸀ഀ
      <Object>2</Object>਍          㰀嘀攀爀猀椀漀渀㸀㈀㰀⼀嘀攀爀猀椀漀渀㸀ഀ
    </AdmInfo>਍        㰀䈀甀猀椀渀攀猀猀倀愀爀琀渀攀爀猀㸀ഀ
      <row>਍   

         㰀䌀愀爀搀吀礀瀀攀㸀㠀㰀⼀䌀愀爀搀吀礀瀀攀㸀ഀ

... 等々 !!!誰か助けてくれませんか?

Notepad++ を使用して、エンコーディングを BOM なしの UTF-8 に設定すると、ファイルは次のようになります。

 <?xml version="1.0" encoding="UTF-16"?>਍㰀伀䈀㸀ഀ
  <CLIENT>਍    㰀䈀伀䴀㸀ഀ
      <BO>਍        㰀䄀搀洀䤀渀昀漀㸀ഀ
          <Object>2</Object>਍          㰀嘀攀爀猀椀漀渀㸀㈀㰀⼀嘀攀爀猀椀漀渀㸀ഀ
        </AdmInfo>਍        㰀䈀甀猀椀渀攀猀猀倀愀爀琀渀攀爀猀㸀ഀ
          <row>਍            㰀䌀愀爀搀吀礀瀀攀㸀㠀㰀⼀䌀愀爀搀吀礀瀀攀㸀ഀ
            <CardCode>01000001</CardCode>਍          㰀⼀爀漀眀㸀ഀ
        </BusinessPartners>਍      㰀⼀䈀伀㸀ഀ
    </BOM>਍  㰀⼀䌀䰀䤀䔀一吀㸀ഀ

リクエストとしての PHP ファイルの一部:

    header('Content-Type: text/xml');
                    //header('Content-Transfer-Encoding: binary');
                    $xml = new DOMDocument();
                    $xml->version='1.0';
                    $xml->encoding='UTF-16';
                    $ob_client = $xml->createElement('OB');
                        $client_element = $xml->createElement('CLIENT');
                            $client_bom_element = $xml->createElement('BOM');
                                $client_bo_element = $xml->createElement('BO');
                                    $client_adminfo_element = $xml->createElement('AdmInfo');
                                        $client_adminfo_object_element = $xml->createElement('Object', '2');
                                        $client_adminfo_version_element = $xml->createElement('Version', '2');

                                    $client_BusinessPartners_element = $xml->createElement('BusinessPartners');
                                        $client_BusinessPartners_row_element = $xml->createElement('row');
                                            $client_BusinessPartners_row_cardtype_element = $xml->createElement('CardType', $_XML_CardType);
                                            $client_BusinessPartners_row_cardcode_element = $xml->createElement('CardCode', $_XML_CardCode);

...
$xml->formatOutput = true;                  
                    echo $xml->saveXML();
                    $xml->save('rudy-xml-particulier'.$commandeId.'.xml');

どうもありがとう。

4

1 に答える 1

2

既に UTF-16 で XML ファイルを生成しています。あなたがする必要があるのは、あなたがするエンコーディングを前もって指定することだけです:

$doc = new DOMDocument();
$doc->encoding='UTF-16';

そのため、データ、特に要素の値を追加すると、問題が発生する可能性が高くなります。PHP は、警告を表示したり、非 UTF-8 バイト シーケンスの追加を妨げたりしません。それを引き起こす例を次に示します。

$_XML_CardType = "\xA9"; # non utf-8 byte-sequence (latin-1 copyright symbol)
$xml->createElement('CardType', $_XML_CardType); # returns DOMElement

次に、使用するとき

echo $xml->saveXML();

PHP は、(PHP のバージョン、エラー報告の設定、および基礎となるライブラリに応じて) 問題について通知し、(新しい PHP バージョンの場合) エラーが発生した場所で文字列を切り取る場合があります。エラー メッセージの例は次のとおりです。

警告: DOMDocument::saveXML(): 変換エラーが原因で出力変換に失敗しました。バイト 0xA9 0x3C 0x2F 0x69

createElementしたがって、値に使用する文字列データが UTF-8 でエンコードされていることを確認する必要があります。そして、それはすでにあなたがする必要があるすべてです。

データベースからデータをフェッチすると言うように、PHP データベース クライアント ライブラリのドキュメントを参照して、UTF-8 エンコーディングで文字列を返す方法を確認してください。それはすぐにあなたの問題を解決するはずです.

UTF-8 エンコーディングで文字列を確実に取得するには、挿入する前にテストします。たとえば、Regex を使用して Invalid UTF-8 String を検出します

if (!preg_match('//u', $_XML_CardType) {
    throw new Exception("Non utf-8 string deteced.");
}
$xml->createElement('CardType', $_XML_CardType);

これにより、挿入する代わりに例外がスローされます。また、エラーを記録/表示し、エラー ストリームをたどって追加の問題を見つけます。

于 2013-03-05T13:14:50.973 に答える