JSON.PHP对中文乱码的解决

本文介绍了解决JSON处理GB2312编码时出现的内容丢失及乱码问题的方法。通过修改JSON编码处理流程,避免将非ASCII字符转换为UTF-16,确保前后端使用GB2312编码时数据正确传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传递GB2312时候,发现有丢失内容情况,还会有乱码。

查看源代码,发现JSON试图将非ASCII字符转成UTF16格式,而处理过程中并未对GB有特殊处理,所以会导致错误。

分析了Json.js,在Script这一层上,Json并未对中文进行特殊编码处理。为何在PHP中要多此一举呢? 大概是为了跨平台传输的原因。

解决方法三个:

1,写一个GB2UTF16函数放进去。

2,采用其他编码作为中介。比如:nbase64

3,干脆不做处理。这个最简单。

根据需求,后台与前端均采用GB,UTF转码并无意义。动手改就很容易了。

 

encode函数中,找到:

case 'string':

 

将处理编码的地方全去掉:

 

case (($ord_var_c >= 0x20) && ($ord_var_c <= 0x7F)):
// characters U-00000000 - U-0000007F (same as ASCII)
$ascii .= $var{$c};
break;

case (($ord_var_c & 0xE0) == 0xC0):
// characters U-00000080 - U-000007FF, mask 110XXXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c, ord($var{$c + 1}));
$c += 1;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xF0) == 0xE0):
// characters U-00000800 - U-0000FFFF, mask 1110XXXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}));
$c += 2;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xF8) == 0xF0):
// characters U-00010000 - U-001FFFFF, mask 11110XXX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}));
$c += 3;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xFC) == 0xF8):
// characters U-00200000 - U-03FFFFFF, mask 111110XX
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}));
$c += 4;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

case (($ord_var_c & 0xFE) == 0xFC):
// characters U-04000000 - U-7FFFFFFF, mask 1111110X
// see http://www.cl.cam.ac.uk/~mgk25/unicode.html#utf-8
$char = pack('C*', $ord_var_c,
ord($var{$c + 1}),
ord($var{$c + 2}),
ord($var{$c + 3}),
ord($var{$c + 4}),
ord($var{$c + 5}));
$c += 5;
$utf16 = $this->utf82utf16($char);
$ascii .= sprintf('u%04s', bin2hex($utf16));
break;

 

然后加上:

 

default:
$ascii .=chr($ord_var_c);
break;

 

 

测试OK。

encode函数中也是一样,把编码的部分去掉,换上

 

default: $utf8 .= chr($ord_chrs_c);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值