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 の後。