【问题标题】:How to decode "Unicode" without "\" like u091cu0940u0935u0928如何在没有“\”的情况下解码“Unicode”,如 u091cu0940u0935u0928
【发布时间】:2021-04-01 23:43:01
【问题描述】:

我正在使用 facebook api 来捕获潜在客户,

我得到了 JSON,我在以文本形式保存到数据库后使用它。

{"created_time":"2020-12-23T04:57:39+0000","id":"1021093571702954","field_data": 
[{"name":"full_name","values":["u091cu0940u0935u0928 u091au094cu0939u093eu0928"]}, 
{"name":"city","values":["delhi"]},{"name":"phone_number","values":["+919911152366"]}, 
{"name":"email","values":["uiabhiu0040gmail.com"]},{"name":"zip_code","values":["110095"]}]}

对于电子邮件,我发现 u0040 代表“@”,所以我在 Php 中使用了字符串替换,但现在问题是我得到了这种格式的名称,我不知道如何解码。

【问题讨论】:

    标签: php json api unicode unicode-escapes


    【解决方案1】:

    使用intl 扩展(确保它是installed,它可能就像在php.ini 中取消注释并重新启动服务器一样简单):

    function translateUnescapedUnicode(string $subject): string
    {
        return preg_replace_callback('/u([0-9a-fA-F]{4})/', function ($match) {
            return IntlChar::chr(hexdec($match[1]));
        }, $subject);
    }
    

    这里发生了什么:

    1. 我们正在捕获未转义的 unicode 序列(u 后跟 4 个十六进制字符)
    2. $match[0] 将具有完整匹配 (uXXXX),而 $match[1] 将仅具有我们的捕获组 (([0-9a-fA-F]{4})) - 十六进制字符
    3. 我们正在使用 hexdec 将十六进制值转换为十进制值
    4. 我们将根据documentation 将十进制值提供给IntlChar::chr

    返回一个包含由 Unicode 码位值指定的字符的字符串。

    在你的 JSON 上测试它:

    $decodedJson = json_decode($json, true);
    foreach ($decodedJson['field_data'] as $fieldData) {
        var_dump(translateUnescapedUnicode($fieldData['values'][0]));
    }
    

    将产生以下内容:

    string(28) "जीवन चौहान"
    string(5) "delhi"
    string(13) "+919911152366"
    string(16) "uiabhi@gmail.com"
    string(6) "110095"
    

    所以你可以在这里看到它保留了没有任何 unicode 字符的常规字符串。

    【讨论】:

    • 查看fiddle 完整的测试代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2021-04-19
    • 2015-11-04
    • 1970-01-01
    • 2012-03-23
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多