6

私はいくつかの解決策を読んでいますが、まだ何も機能させることができていません。

API 呼び出しから読み取った JSON 文字列があり、Unicode 文字が含まれています\u00c2\u00a3。たとえば、£ 記号です。

£PHP を使用して、これらをまたはのいずれかに変換したいと思います£

問題を調査したところ、次のコードが見つかりました (ポンド記号を使用してテストしました) が、機能していないようです。

$title = preg_replace("/\\\\u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", '\u00c2\u00a3');

出力は£です。

これは UTF-16 でエンコードされていると考えるのは正しいですか? これらをHTMLとして出力するにはどうすればよいですか?

アップデート

API からの JSON 文字列には、エスケープされていない Unicode 文字列が 2 つまたは 3 つ含まれているようです。

That\u00e2\u0080\u0099s (right single quotation)
\u00c2\u00a (pound symbol)
4

3 に答える 3

11

UTF-16 エンコーディングではありません。\uXXXX エンコーディングは、Unicode の UTF や UCS エンコーディングとは無関係であるため、偽のエンコーディングのように見えます。\u00c2\u00a3実際には£文字列にマップされます。

あなたが持っているべきもの\u00a3は、 のユニコードコードポイントです£

{0xC2, 0xA3} は、このコード ポイントの UTF-8 でエンコードされた 2 バイト文字です。

私が思うに、元の UTF-8 文字列を JSON にエンコードしたソフトウェアが、それが UTF-8 であるという事実に気づかず、各バイトを盲目的にエスケープされた Unicode コード ポイントにエンコードした場合、Unicode コードの各ペアを変換する必要があります。 UTF-8 でエンコードされた文字を指し、それをネイティブ PHP エンコーディングにデコードして印刷可能にします。

function fixBadUnicode($str) {
    return utf8_decode(preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2"))', $str));
}

例: http://phpfiddle.org/main/code/6sq-rkn

編集:

有効な JSON 文字列を取得するために文字列を修正する場合は、次の関数を使用する必要があります。

function fixBadUnicodeForJson($str) {
    $str = preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2")).chr(hexdec("$3")).chr(hexdec("$4"))', $str);
    $str = preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2")).chr(hexdec("$3"))', $str);
    $str = preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2"))', $str);
    $str = preg_replace("/\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1"))', $str);
    return $str;
}

編集 2:誤って Unicode エスケープされた utf-8 バイト シーケンスを同等の utf-8 文字に変換するように前の関数を修正しました。

これらの文字の一部は、おそらく Word などのエディターからのものであり、ISO-8859-1 に変換できないため、'?' として表示されることに注意してください。ut8_decode の後。

于 2013-01-25T14:43:20.583 に答える
3

出力は正しいです。

\u00c2 == Â
\u00a3 == £

したがって、ここでは何も問題はありません。また、HTML エンティティへの変換は簡単です。

htmlentities($title);
于 2013-01-25T14:41:19.390 に答える