当解码使用javascript发布的json字符串时,PHP格式错误的utf-8

时间:2014-06-25 09:20:56

标签: javascript php encoding hex json

我正在开发一个无法修改PHP代码的项目。我只能在编写JavaScript时修改JavaScript。

我将包含UTF-8字符的十六进制编码数据发布到PHP脚本。当PHP脚本尝试将数据解码为JSON时。 decode函数返回null并获得以下错误“格式错误的UTF-8字符,可能编码错误”。

十六进制解码似乎修改了编码,例如法语句子

  

L'équitationenFrance estletroisièmeporten nombre delicenciés

将转换为:

  

L \x18équitationenFrance estletroisièmeporten nombre delicenciés

阿拉伯语句子或使用非拉丁字符的任何语言都会变得更糟,因为它不再可读。

我可以在Javascript部分做任何事情来解决问题。在将它们转换为HEX之前,可能会进行某种转换以保留句子吗?

他是一个简单的代码演示问题:

PHP代码:

if(!empty($_POST)){

    print_r($_POST);

    $data = Hex2String($_POST["data"]);

    $result = json_decode($data, true);
    $errors = json_last_error();
    echo "Errpr: {$errors}<br />";

    var_dump($result);
    exit();
}

function Hex2String($hex){
    $string='';
    for ($i=0; $i < strlen($hex)-1; $i+=2){
        $string .= chr(hexdec($hex[$i].$hex[$i+1]));
    }
    return $string;
}

JavaScript代码

    /***
     * Converts a string into a hex representation of the string.
     * @param {string} string
     * @returns {String}
     */
    function Str2Hex (tmp){
        var str = "";
        for (var i=0; i<tmp.length; i++)
            str += ("00" + (tmp.charCodeAt(i)).toString(16)).substr(-2);
        return (str);
    }

    $(function(){


        var data = {
            frenchText: "L‘équitation en France est le troisième sport en nombre de licenciés",
            germanText: "Das für sein karolingisches in Höxter",
            arabicText: "جانب من آثار مدينة جدارا اليونانيَّة"
        };


        $.post("index.php?DBGSESSID=1", {data:Str2Hex(JSON.stringify(data))},function(data) {

            console.log($("#result"));
            console.log(data);

            $("#result").html(data);
        });
    });

完整示例:

<?php

    if(!empty($_POST)){

        print_r($_POST);

        $data = Hex2String($_POST["data"]);

        $result = json_decode($data, true);
        $errors = json_last_error();
        echo "Errpr: {$errors}<br />";

        var_dump($result);
        exit();
    }

    function Hex2String($hex){
        $string='';
        for ($i=0; $i < strlen($hex)-1; $i+=2){
            $string .= chr(hexdec($hex[$i].$hex[$i+1]));
        }
        return $string;
    }
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
        <title>index</title>
        <link rel="stylesheet" href="/css/master.css" type="text/css" media="screen" title="no title" charset="utf-8" />
        <script type="text/javascript" charset="utf-8" src="./js/jquery.js"></script>
    </head>
    <body>

        <div id="result">

        </div>

        <script type="text/javascript">


            /***
             * Converts a string into a hex representation of the string.
             * @param {string} string
             * @returns {String}
             */
            function Str2Hex (tmp){
                var str = "";
                for (var i=0; i<tmp.length; i++)
                    str += ("00" + (tmp.charCodeAt(i)).toString(16)).substr(-2);
                return (str);
            }

            $(function(){


                var data = {
                    frenchText: "L‘équitation en France est le troisième sport en nombre de licenciés",
                    germanText: "Das für sein karolingisches in Höxter",
                    arabicText: "جانب من آثار مدينة جدارا اليونانيَّة"
                };


                $.post("index.php?DBGSESSID=1", {data:Str2Hex(JSON.stringify(data))},function(data) {

                    console.log($("#result"));
                    console.log(data);

                    $("#result").html(data);
                });
            });
        </script>
    </body>
</html>

1 个答案:

答案 0 :(得分:0)

找到解决方案:

function forceUnicodeEncoding(string) {
    return unescape(encodeURIComponent(string));
}

data.frenchText = forceUnicodeEncoding(data.frenchText);
data.germanText = forceUnicodeEncoding(data.germanText);
data.arabicText = forceUnicodeEncoding(data.arabicText);

唯一的问题是在JavaScript 1.5版中不推荐使用unescape函数。

来源: http://andre.arko.net/2012/09/18/force-encoding-in-javascript/