2

サーバーからいくつかのxmlを受け取り、いくつかのコンボボックスにデータを入力するためにそれを解析しようとするC++プログラムがあります。

<?xml version="1.0"?>
    <CustomersMachines>
        <Customer name="bob" id="1">
            <Machine name="office1" id="1" />
            <Machine name="officeserver" id="2" />
        </Customer>
     </CustomersMachines>

これらの値の場合、TinyXML は適切に解析し、結果のコンボ ボックスは意図したとおりに設定されます。この問題は、マルチバイト文字が name 要素の末尾 (バイト数によっては、その近く) に配置されている場合に発生します。

<Customer name="boß" id="3">

値boß" id=がコンボ ボックスに入力されます。

デバッガーをステップ実行すると、マルチバイト文字が ReadText() に渡されると、要素内の次の 1 ~ 3 個のシングルバイト文字がスキップされますが、自動的に含まれることがわかります。そのため、tinyXML は終了引用符を登録せず、保持します。次のものに到達するまで解析します。xml を送信するサーバー上で実行されているアプリケーションは主に ISO-8859-1 エンコーディングを使用しますが、tinyXML はデフォルトで UTF-8 に設定されています。

問題を解決するように見えますが、プログラムの他の場所でかなりの数の問題を引き起こす TIXML_ENCODING_UNKNOWN を使用するようにデフォルトで tinyxml を微調整しようとしました。私が試した他のことは、送信する前にxmlサーバー側をutf8_encodeすることです(ただし、これにより、マルチバイト文字があるべきコンボボックスに奇妙な文字が表示されます)、送信されるxmlにエンコードを強制しますクライアントプログラムは役に立ちません。

この場合、マルチバイト文字が次の 1 ~ 3 文字を自動的に無視するのを防ぐ方法を知っている人はいますか?

4

1 に答える 1

0

<?xml?>プロローグはエンコーディングを指定していません。エンコーディングが帯域外手段によって XML の外部で利用できない場合は、XML 仕様の付録 Fで概説されている規則に従って、XML の開始バイトを分析してエンコーディングを推測する必要があります。この場合、UTF-8 が選択される可能性があります。XML が実際には UTF-8 でエンコードされていない場合、それが表示されている動作の原因になります。

ISO-8859-1 では、はßbyte octet としてエンコードされ、 byte octet としてエンコードされます。0xDF"0x22

UTF-8 では0xDF、2 バイトのオクテット シーケンスの開始バイトであり、"スキップされます。ただし、0xDF 0x22有効な UTF-8 2 オクテット バイト シーケンスではないため、TinyXml はエラーで解析に失敗するはずです。そうでない場合、それは TinyXml のバグです。

XML が実際に ISO-8859-1 でエンコードされている場合、サーバーはその情報を提供する必要があります。そうでない場合、それはサーバーのバグです。

于 2013-03-15T17:00:28.700 に答える