PHP自带的json_encode只支持UTF-8编码,其他编码的需要转到UTF-8编码下才能使用。下面是自己写的处理这个问题的函数,分享给大家,希望能对大家有用。注释很详细了,就不说多了,直接看吧。


/*
+------------------------
json_encode 增强版 可将任意编码的变量编码为json字符串
$in 要处理的变量
$charset 编码
+------------------------
**/
function json_encode_set($in,$charset_in='UTF-8',$charset_out='UTF-8')
{

    return iconv('UTF-8',$charset_out,json_encode(iconv_all($charset_in,'UTF-8',$in)));
}

/*
+------------------------
json_decode 增强版
上面json_encode_set的逆运算
$in 要处理的json字符串
$charset 编码
$assoc 返回值 false对象 true数组
+------------------------
**/
function json_decode_set($in,$assoc='true',$charset_in='UTF-8',$charset_out='UTF-8')
{
    return iconv_all('UTF-8',$charset_out,json_decode(iconv($charset_in,'UTF-8',$in),$assoc));
}

/*
+------------------------
iconv 增强版
参数同iconv
原版iconv只能接受字符串
这里的$in可以接受字符串、数组、对象
+------------------------
**/
function iconv_all($in_charset,$out_charset,$in)
{
    if(is_string($in))
    {
        $in=iconv($in_charset,$out_charset,$in);
    }
    elseif(is_array($in))
    {
        foreach($in as $key=>$value)
        {
            $in[$key]=iconv_all($in_charset,$out_charset,$value);
        }
    }
    elseif(is_object($in))
    {
        foreach($in as $key=>$value)
        {
            $in->$key=iconv_all($in_charset,$out_charset,$value);
        }
    }

    return $in;
}

GB2312
范围: 0xA1A1 – 0xFEFE
汉字范围: 0xB0A1 – 0xF7FE
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集–基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。 GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规 定”对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为”高字节”,第二个字节为”低字节”。GB2312- 80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中文字符集,这也是最基本的中文字符集。其编码 范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于0xf7fe。

 

GBK
范围: 0×8140 – 0xFEFE

GB2312-80 仅收汉字 6763 个,这大大少于现有汉字,随着时间推移及汉字文化的不断延伸推广,有些原来很少用的字,现在变成了常用字,例如:朱鎔基的“鎔”字,未收入 GB2312-80,现在大陆的报业出刊只得使用(金+容)、(金容)、(左金右容)等来表示,形式不一而同,这使得表示、存储、输入、处理都非常不方 便,对于搜索引擎等软件的构造来说也不是好消息,而且这种表示没有统一标准。从我们对人民日报 98 年数据的处理过程中,得出这样的经验:回填外字最困难的就是如何得到这种表示方法的集合。
为了解决这些问题,以及配合 UNICODE 的实施,全国信息技术化技术委员会于 1995 年 12 月 1 日《汉字内码扩展规范》。GBK 向下与 GB2312 完全兼容,向上支持 ISO-10646 国际标准,在前者向后者过渡过程中起到的承上启下的作用。
GBK是GB2312-80的扩展,是向上兼容的。它包含了20902个汉字,其编码范围是0×8140-0xfefe,剔除高位0×80的字位。其所有字符都可以一对一映射到Unicode2.0。
字集
GBK 共收入21886个汉字和图形符号,包括:
GB2312 中的全部汉字、非汉字符号。
BIG5 中的全部汉字。
与 ISO-10646 相应的国家标准 GB13000 中的其它 CJK 汉字,以上合计 20902 个汉字。
其它汉字、部首、符号,共计 984 个。
GBK 编码区分三部分:
汉字区 包括
GBK/2:OXBOA1-F7FE, 收录 GB2312 汉字 6763 个,按原序排列;
GBK/3:OX8140-AOFE,收录 CJK 汉字 6080 个;
GBK/4:OXAA40-FEAO,收录 CJK 汉字和增补的汉字 8160 个。
图形符号区 包括
GBK/1:OXA1A1-A9FE,除 GB2312 的符号外,还增补了其它符号
GBK/5:OXA840-A9AO,扩除非汉字区。
用户自定义区
即 GBK 区域中的空白区,用户可以自己定义字符。
編碼
GBK 亦采用双字节表示,总体编码范围为 8140-FEFE 之间,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 XX7F 一条线。
微 软公司自 Windows 95 简体中文版开始支持 GBK 代码,標準叫法是 Windows codepage 936,也叫做 GBK(國標擴展),它也是 8-bit 的變長編碼。據我所知 GBK 從來沒成爲過正式的國家標準,只不過因爲 Windows 的普及,它已經成爲事實上的標準了。但目前的多数搜索引擎都不能很好地支持 GBK 汉字。
由前电子部科技质量司和国家技术监督局标准化司于1995年12月颁布的指导性规范。(GBK的 K是“扩展”的汉语拼音第一个字母)
GBK作为非 UCS ( ISO/IEC 10646 ) 体系的代码页,适用于中文信息的处理、交换、存储、传输、显现、输入和输出。
GBK 与国家标准 GB 2312-80 信息处理交换码所对应的、事实上的内码标准兼容;同时,在字汇一级支持 ISO/IEC 10646-1 和GB 13000-1 的全部中日韩 (CJK) 汉字(20902字)。GBK除了包含GB2312-80 和GB12345-90中包括的全部非汉字符号外,还涵盖我国台湾地区中文标准交换码TCA-CNS 11643 -92 ( 与其对应的内码为Big5;以下用Big5泛指二者。) 中的绝大多数符号。
从Windows95中文版起,Windows NT 3.51, 4.0, Windows2000, Windows CE, Linux已经全面支持GBK,起到了从GB 2312向Unicode过渡的承上启下的重要作用。
GBK尽管在字汇一级支持CJK,是目前最大的Code Page ;它在体系结构、代码空间上,仍然是完全不同于ISO/IEC 10646 和Unicode的。
BIG5
范围: 0xA140 – 0xF9FE, 0xA1A1 – 0xF9FE

Big5是台湾的IIIT1984年发明的,CNS 11643-1992( Chinese National Standard)
是扩展版本,主要大家用的还是big5
每个字由两个字节组 成,其第一字节编码范围为0xA1~0xF9,第二字节编码范围为0×40~0×7E与0xA1~0xFE,总计收入13868个字 (包括5401个常用字、7652 个次常用字、7个扩充字、以及808个各式符号)
GB18030:
GB18030-2000(GBK2K)在GBK的基础上进一步扩展了汉字,增加了藏、蒙等少数民族的字形。GBK2K从根本上解决了字位不够,字形不足的问题。它有几个特点:
它并没有确定所有的字形,只是规定了编码范围,留待以后扩充。
编码是变长的,其二字节部分与GBK兼容;四字节部分是扩充的字形、字位,其编码范围是首字节0×81-0xfe、二字节0×30-0×39、三字节0×81-0xfe、四字节0×30-0×39。
它的推广是分阶段的,首先要求实现的是能够完全映射到Unicode3.0标准的所有字形。
它是国家标准,是强制性的。
补充:
中文信息编码标准,常用的是GB2312-1980,GB12345,GB13000(GBK),
以及最新标准GB18030。
GB2312的汉字编码规则为:第一个字节的值在0xB0到0xF7之间,第
二个字节的值在0xA0到0xFE之间。
GB12345和GB13000是对GB2312-1980的扩充,所有已经包含在GB2312
中的汉字编码不变,另外增加更多的码位。其编码规则大致为:第一
个字节的值在0×81到0xFE之间,第二个字节的值在0×40到0xFE之间。

 
GB18030 是最新的汉字编码字符集国家标准, 向下兼容 GBK 和 GB2312 标准。
GB18030 编码是一二四字节变长编码。 一字节部分从 0×0~0×7F 与 ASCII
编码兼容。 二字节部分, 首字节从 0×81~0xFE, 尾字节从 0×40~0×7E 以及
0×80~0xFE, 与 GBK标准基本兼容。 四字节部分,
第一字节从 0×81~0xFE, 第二字节从 0×30~0×39, 第三和第四字节的范围和前
两个字节分别相同。 四字节部分覆盖了从 0×0080 开始, 除去二字节部分已经
覆盖的所有 Unicode 3.1 码位。也就是说, GB18030 编码在码位空间上做到
了与 Unicode 标准一一对应,这一点与 UTF-8 编码类似。
UTF_8字符集
UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化 为RFC 3629。UTF-8用1到6个字节编码UNICODE字符。如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节, 而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到 那样的UNICODE字符。
Hong Kong GCCS是香港政府为big5加的3049个字,(Government Chinese Character Set)
香港增补字符集(HKSCS)是后来的标准,包括了Big5和ISO10646的编码,所以HKSCS的big5
版是补充了GCCS的增强版,ISO10646是UCS(universal character set),ISO是政府组织
Unicode是电脑业界组织,不过UCS和Unicode的字库一样

编码字数统计:
GB2312 6763个汉字
GB12345 6866个汉字
GBK 21003个汉字
GB18030 27000个汉字
Big5 13053个汉字
CNS11643 48,027个汉字