在php中如何使用json_decode解析gbk编码的json字符串

简介:
今天看到csdn的bbs上有人问如何用json_decode解析gbk编码的串。
大家都知道,json都是utf8编码的。json_encode后的字符串都是会变成"\u4fe1\u6d77\u9f99"格式。

如下面的代码:


$arr = "信海龙";
echo json_encode($arr);


输出结果为:"\u4fe1\u6d77\u9f99"

如果你有一个符合json格式的gbk编码的字符串,如何使用json_decode进行解析呢?

答案其实很简单,呵呵。就是把字符串转为utf8编码既可。

你可以在gbk编码的文件中执行如下脚本,看效果。


<?php
$json = '"信海龙"'; //一个符合json格式的gbk编码串
var_dump(json_decode($str)); //输出NULL
$str = mb_convert_encoding($json, "utf8", "gbk");
var_dump(json_decode($str)); //输出 string(9) "信海龙"
?>

输出结果如下:
NULL string(9) "信海龙"

为什么只要转为utf8编码就可以呢?分析下源码。
在ext/json/json.c文件有json_decode的实现。代码如下:


PHP_JSON_API void php_json_decode(zval *return_value, char *str, int str_len, zend_bool assoc, long depth TSRMLS_DC) /* {{{ */
{
    int utf16_len;
    zval *z;
    unsigned short *utf16;
    JSON_parser jp;
 
    utf16 = (unsigned short *) safe_emalloc((str_len+1), sizeof(unsigned short), 1);
 
    utf16_len = utf8_to_utf16(utf16, str, str_len);
    if (utf16_len <= 0) {
        if (utf16) {
            efree(utf16);
        }
        JSON_G(error_code) = PHP_JSON_ERROR_UTF8;
        RETURN_NULL();
    }
 
    if (depth <= 0) {
        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Depth must be greater than zero");
        efree(utf16);
        RETURN_NULL();
    }
 
    ALLOC_INIT_ZVAL(z);
    jp = new_JSON_parser(depth);
    if (parse_JSON(jp, z, utf16, utf16_len, assoc TSRMLS_CC)) {
        *return_value = *z;
    }
    else
    {
        double d;
        int type;
        long p;
 
        RETVAL_NULL();
        if (str_len == 4) {
            if (!strcasecmp(str, "null")) {
                /* We need to explicitly clear the error because its an actual NULL and not an error */
                jp->error_code = PHP_JSON_ERROR_NONE;
                RETVAL_NULL();
            } else if (!strcasecmp(str, "true")) {
                RETVAL_BOOL(1);
            }
        } else if (str_len == 5 && !strcasecmp(str, "false")) {
            RETVAL_BOOL(0);
        }
 
        if ((type = is_numeric_string(str, str_len, &p, &d, 0)) != 0) {
            if (type == IS_LONG) {
                RETVAL_LONG(p);
            } else if (type == IS_DOUBLE) {
                RETVAL_DOUBLE(d);
            }
        }
 
        if (Z_TYPE_P(return_value) != IS_NULL) {
            jp->error_code = PHP_JSON_ERROR_NONE;
        }
 
        zval_dtor(z);
    }
    FREE_ZVAL(z);
    efree(utf16);
    JSON_G(error_code) = jp->error_code;
    free_JSON_parser(jp);
}

注意方法中这行代码:
utf16_len = utf8_to_utf16(utf16, str, str_len);
也就是把utf8编码的串转换为utf16编码串,然后在调用parse_JSON方法解析。找个方法在JSON_parser.c中定义。


/*
    The JSON_parser takes a UTF-16 encoded string and determines if it is a
    syntactically correct JSON text. Along the way, it creates a PHP variable.
 
    It is implemented as a Pushdown Automaton; that means it is a finite state
    machine with a stack.
*/
int
parse_JSON(JSON_parser jp, zval *z, unsigned short utf16_json[], int length, int 

看注释,这个方法是需要接收utf16编码的。


目录
相关文章
|
4月前
|
PHP C++ 索引
PHP 高效之道:字符串与数组处理的实用技巧
PHP 高效之道:字符串与数组处理的实用技巧
237 83
|
2月前
|
JSON 缓存 自然语言处理
多语言实时数据微店商品详情API:技术实现与JSON数据解析指南
通过以上技术实现与解析指南,开发者可高效构建支持多语言的实时商品详情系统,满足全球化电商场景需求。
|
4月前
|
存储 JSON 关系型数据库
【干货满满】解密 API 数据解析:从 JSON 到数据库存储的完整流程
本文详解电商API开发中JSON数据解析与数据库存储的全流程,涵盖数据提取、清洗、转换及优化策略,结合Python实战代码与主流数据库方案,助开发者构建高效、可靠的数据处理管道。
|
3月前
|
JSON 算法 API
淘宝商品评论API接口核心解析,json数据返回
淘宝商品评论API是淘宝开放平台提供的数据服务接口,允许开发者通过编程方式获取指定商品的用户评价数据,包括文字、图片、视频评论及评分等。其核心价值在于:
|
1月前
|
JSON Java Go
【GoGin】(2)数据解析和绑定:结构体分析,包括JSON解析、form解析、URL解析,区分绑定的Bind方法
bind或bindXXX函数(后文中我们统一都叫bind函数)的作用就是将,以方便后续业务逻辑的处理。
264 3
|
1月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
164 0
|
2月前
|
JSON 自然语言处理 API
多语言实时数据淘宝商品评论API:技术实现与JSON数据解析指南
淘宝商品评论多语言实时采集需结合官方API与后处理技术实现。建议优先通过地域站点适配获取本地化评论,辅以机器翻译完成多语言转换。在合规前提下,企业可构建多语言评论数据库,支撑全球化市场分析与产品优化。
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
827 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
330 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS