何がって、PHPでサロゲートペアをJSONで扱う時のバグである。
以下、サンプルコード。
require_once "JSON.php"; $json["doc"]["info"]["t"] = "𠀋";//0x2000Bが1文字 $jsonstr = json_encode($json); file_put_contents("c:/tmp/2000C.txt",$jsonstr); $jjj = new Services_JSON; $jsonstr = $jjj->encode($json); file_put_contents("c:/tmp/2000C-PEAR.txt",$jsonstr);で結果なのだが、、
●json_encodeの場合
{"doc":{"info":{"t":"\ud800\udc0b"}}}
え?d800ってなんだ!?d840じゃないのか!!
●Services_JSONのencodeの場合
{"doc":{"info":{"t":"\ud840dc0b"}}}
え?d840dc0bって8桁じゃないか!?
ってことで、どっちにしてもダメです。
でも、PEARのJSONの方は、明らかに、
sprintf('\u%04s', bin2hex($utf16));
っていう行が発見できるので、8ケタの時は、\uを入れるように、ここを修正すればなんとかなる。
んーー。。やっぱこんなことやる人は、そうそういないってことだよなぁーー。
0 件のコメント:
コメントを投稿