2013年4月2日火曜日

PHPでサロゲートペアをJSONで扱うときのバグ。

どうにもこうにもダメなのである。
 何がって、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 件のコメント:

コメントを投稿