それをJSON化し、それをPHPでPOSTで受け取るテストをしてみます。
テストとしては、どうやって文字列処理をすればいいのかってことですね。
また、javascriptからPOSTする方法も含めてテストしてみます。
ってことで、こんなコードでテスト
- <script type="text/javascript">
- var s = "【\u0027】"; // '
- s += "【\u0022】"; // "
- s += "【\u005c】"; // \
- s += "【\u002f】"; // /
- s += "【\u000d】"; // 0d \r
- s += "【\u000a】"; // 0a \n
- s += "【\u0009】"; // tab
- var OJ = function() {};
- var o = new OJ();
- o.dat1 = s;
- var ss = JSON.stringify(o);
- // alert(ss + " / " + ss.length);
- jspost("01.php","param",ss);
- </script>
- php
- $a = Var_Dump::display($_POST,true);
- echo $a;
- ------------------POST------------------
- array(1) {
- param => string(77) {\"dat1\":\"【\'】【\\\"】【\\\\】【/】【\\r】【\\n】【\\t】\"}
- }
- ってことは、、、
- {"dat1":【'】【\"】【\\】【/】【\r】【\n】【\t】}
- が
- {\"dat1\":\"【\'】【\\\"】【\\\\】【/】【\\r】【\\n】【\\t】\"}
- になってるってことです。
まぁJSONできてるから、JSONをdecodeできる文字列に変更する必要があるわけです。
まず、これはPHPの設定になるわけですが、文字のエンコードを調べます。
echo mb_detect_encoding($param);
ってやってみると、、
UTF-8
となりました。これが「UTF-8以外でいいことなんて、とりあえず何もありませんから、PHPは全てUTF-8前提で考えます。
ってことで、var_dumpでこういう結果↓をえるためには、
- array(1) {
- dat1 => string(52) ◆【'】【"】【\】【/】【
- 】【
- 】【 】
- }
- $param = $_POST['param'];
- $param = preg_replace("/\x5c\x5c\x22/", "\x22",$param); //【\"】 を 【"】 にする
- $param = preg_replace("/\x5c\x5c\x27/", "\x27",$param); //【\'】 を 【'】 にする
- $param = preg_replace("/\x5c\x5c\x5c\x5c/", "\x5c\x5c",$param); //【\\】 を 【\】 にする
そうやったからって言って、速度が速くなるわけでもないので(実験しました)、見やすいように3行にしました。
関数としてはたいしたことない関数。
- function objectFromJsJson($v){
- $vv = preg_replace("/\x5c\x5c\x22/", "\x22",$v); // 【\"】 を 【"】 にする
- $vv = preg_replace("/\x5c\x5c\x27/", "\x27",$vv); // 【\'】 を 【'】 にする
- $vv = preg_replace("/\x5c\x5c\x5c\x5c/", "\x5c\x5c",$vv); // 【\\】 を 【\】 にする
- $json = json_decode($vv,true);
- return $json;
- }
しかしここで、PHPでencodeすると、こんな文字列になります。
- //【コード】
- $str = json_encode($json);
- echo $str;
- //【結果】
- {"dat1":"\u25c6\u3042\u3010'\u3011\u3010\"\u3011\u3010\\\u3011\u3010\/\u3011\u3010\r\u3011\u3010\n\u3011\u3010\t\u3011"}