何がって、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 件のコメント:
コメントを投稿