6

データベース(および一部のJSONフィード)からのデータからXMLを生成しています。

XMLを壊している16進文字を含むテキストで問題が発生しています。

たとえば、Chromeから発生するエラーのスクリーンショットをご覧ください。 XMLエラー

問題を引き起こしている16進文字を特定しました(制御文字と呼ばれていると思います)。そして、これらは次のとおりです。

0x03
0x05
0x16
0x0E

XML出力に出力する前に、これらの文字をPHPに置き換えるにはどうすればよいですか?

ありがとう!

4

4 に答える 4

16

それらのキャラクターだけでなく、それを壊します...

preg_replace('/[\x00-\x1f]/', '?', $s);
于 2012-04-12T22:59:53.790 に答える
4

リストする文字は実際には制御文字であり、すべてC0セットに配置されています。

0x03 - ETX  End of Text
0x05 - ENQ  Enquiry
0x0E - SO   Shift Out
0x16 - SYN  Synchronous Idle

これらの文字がどのように文字列に入ったかを確認する必要があります。それらを削除することを実際に提案することはできません(削除する場合は、少なくとも置換文字を使用し、削除するだけではありません)が、無効なUnicodeではないため、ここではもう少し保守的にして、数値に変換するだけですエンティティ(これもここで正常に実行されています):

$pairs = array(
    "\x03" => "",
    "\x05" => "",
    "\x0E" => "",
    "\x16" => "",
);
$xml = strtr($xml, $pairs);

これがお役に立てば幸いです。

于 2012-04-12T23:24:39.670 に答える
0

入力が特定の文字セットであることが約束されている場合は、文字セットエンコーディング関数の1つを使用して、可能な限り多くのデータを保持できます(厄介な文字の欠落がなく、テキストが混乱しているように見える可能性があります)。utf8_encodeが役立つ可能性がありますが、テキストがISO-8859-1であることがわかっている場合に限ります。それ以外の場合は、iconvがインストールされていると仮定すると、iconvの方がうまくいく可能性があります。

私の意見では、iconvの最も優れている点は、UTFから機能の低い文字セットにダウンコンバートする場合に音訳を使用できることです。ただし、UTF-8にエンコードする場合は、次のようなものが必要になる可能性があります。

$resultText = iconv("ISO-8859-1", "UTF-8//IGNORE", $inputText );
于 2012-04-12T23:21:41.673 に答える
-1
preg_replace("/[[^0]\x03-[^0]\x05\-[^0]\x16-[^0]\x0E]/", '', $string);
于 2012-04-12T23:00:34.757 に答える