0

ユニコード (UTF-16) の値と PHP/XML で多くの問題を抱えています。XML から一連の Unicode 値を読み取り、正しいグリフをブラウザーに出力したいと考えています。UTF-8 で試してみましたが、同じ問題が発生します。

これは、最初のテストで使用した簡単な作業例です。

$text = "\x00\x41";

$text = mb_convert_encoding($text, "ASCII", "UTF-16");

echo $text;

上記のコードの出力:

A

ただし、XML から値を取得しようとすると、動作が停止します。

XML:

<glyphs>
    <code>0041</code>
    <code>0042</code>
    <code>0043</code>
    <code>0044</code>
    <code>0045</code>
    <code>0046</code>
</glyphs>

PHP では、上記の xml から各値を読み取り、\x00\x41 などのペアと形式に分割します。

PHP:

// load xml
$xml = simplexml_load_file('encoding.xml');

if ($xml) {

    // get families
    foreach($xml->children() as $item) {

        $pairs = str_split($item, 2);

        $hex = "\x" . $pairs[0] . "\x" . $pairs[1];

        // check value...
        echo $hex . '<br/>';

        $text = mb_convert_encoding($hex, "ASCII", "UTF-16");

        echo $text;
    }

}
else {
    return 'The input is malformed.';
}

ブラウザでの出力:

\x00\x41
????
\x00\x42
????
\x00\x43
????
\x00\x44
????
\x00\x45
????
\x00\x46
????

疑問符は、A、B、C、D、E、F である必要があります。

私は何を間違っていますか?

ありがとう。

4

3 に答える 3

1

「\x00」は文字列内の16進表記であり、コンパイル時に処理されます。
「\x」+「00」を使用すると、コンパイラは最初に「\ x」が何であるかを理解しようとし(結果が何であるかわかりません)、その後でのみ「00」を連結すると思います。あなたが期待するものではありません。

Java-> Java:文字列"\uFFFF"をcharに変換しますがこの質問が役立つかもしれません

編集:コメントをフォローアップするだけです。リテラル「\x41」をxmlに配置しても、4文字の文字列を読み取っているため、役に立ちません。
したがって、問題は次のように言い換えることができます。UTF-16を使用して、16進数の数値の文字列表現を1文字に変換する方法。これは、Javaではなくphpで実行することを除いて、上記でリンクした質問と同じ問題です。

于 2010-01-29T20:00:05.423 に答える
1

テスト プログラムは、テスト文字ごとにいくつかの ASCII 文字を書き込み、その後
に ASCII の ' ' が続き、その後に 2 バイトの UTF-16 が続きます。これはうまくいきません。ファイルは、一度に 1 つの文字エンコーディングのみを使用する必要があります。

まず、スクリプトを書き直して、すべての出力を UTF-16 (またはその他) に変換します。

2 つ目は、ブラウザが混合エンコーディング ファイルを UTF-16、おそらく ISO 8859-1、または一般的なデフォルトである Windows Latin 1 以外のものとして解釈しているようです。(HTTP ヘッダーまたはコンテンツ タイプのメタ タグで) 明示的に指示されない限り、ブラウザーがファイルを UTF-16 として解釈する可能性はほとんどありません。コンテンツ タイプを指定しないままにしておくと (Web サーバーがデフォルトで送信しているかどうかを確認してください)、一部のブラウザーはエンコーディングを推測しようとします。あなたの混合ファイルがUTF-16であると推測する人はいないでしょう。

指定したコンテンツ タイプに従ってブラウザがファイルを解釈していることを確認するまでは、期待どおりに動作するとは思わないでください。

最後に、mb_convert_encoding の代わりに iconv を使用することをお勧めします。iconv はより適切に維持され、サポートされるエンコーディングのより広いセットを備えています。

于 2010-01-29T20:36:06.270 に答える
0

ヘッダーで出力を正しく設定していますか?

header('Content-Type: text/html; charset=utf-8');

...そして HTML の頭にも?

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
于 2010-01-29T19:28:11.107 に答える