AJAX服务器端发送GB2312中文字符,客户端如何处理才能不显示乱码

AJAX服务器端发送GB2312中文字符,客户端如何处理才能不显示乱码,第1张

大多数的客户端都采用UTF-8编码,这也是现在实现国际化最常用的编码格式

在这种情况下,实用AJAX异步获取GB2312编码的服务器端信息时,不可避免的要遇到汉字乱码问题

因为目标数据是GB2312,但XML>

传字符串前先用encodeURIComponent将字符串编码(会将中文按UTF-8编码)

然后PHP端接收时转换一下

$utf8_str = urldecode($_POST['value']);

$gbk2312_str = iconv('utf-8','gb2312',$utf8_str);

function js_unescape($str)

{

$ret = '';

$len = strlen($str);

for ($i = 0; $i < $len; $i++)

{

if ($str[$i] == '%' && $str[$i+1] == 'u')

{

$val = hexdec(substr($str, $i+2, 4));

if ($val < 0x7f) $ret = chr($val);

else if($val < 0x800) $ret = chr(0xc0|($val>>6))chr(0x80|($val&0x3f));

else $ret = chr(0xe0|($val>>12))chr(0x80|(($val>>6)&0x3f))chr(0x80|($val&0x3f));

$i += 5;

}

else if ($str[$i] == '%')

{

$ret = urldecode(substr($str, $i, 3));

$i += 2;

}

else $ret = $str[$i];

}

return $ret;

}

上面这个函数是接收ajax传过来的参数是调用

使用方法:js_unescape($_GET['通过ajax传过来的参数']);

function phpescape($str)

{

$sublen=strlen($str);

$retrunString="";

for ($i=0;$i<$sublen;$i++)

{

if(ord($str[$i])>=127)

{

$tmpString=bin2hex(iconv("utf-8","ucs-2",substr($str,$i,2)));

//$tmpString=substr($tmpString,2,2)substr($tmpString,0,2);linux下打开这项

$retrunString="%u"$tmpString;

$i++;

} else {

$retrunString="%"dechex(ord($str[$i]));

}

}

return $retrunString;

}

上面这个函数是返回给调用层进行的编码 *** 作

使用方法:phpescape('你所要输出的内容');

地址栏中出现汉字的情况有两种,一种是汉字出现在URL的路径部分,一种是汉字出现在URL的传参的部分,第二种情况的时候必须采用编码后传参,接受时解码的方式完成传参。js中编码有escape(),encodeURI(),encodeURIComponent()三个常用的方法,escape()常常用在提交页面和处理页面的编码格式相同的情况下(比如它们都是GB2312),encodeURI()和encodeURIComponent()的用法基本相同,区别在于encodeURIComponent()也对""等特殊字符进行编码。

一开始遇到中文参数的时候,使用encodeURI()进行了一遍编码,传过去后,发现解码出现问题,于是想到可能是编码方法使用错误,于是使用escape()方法,这时发现解码时抛出isHexDigit异常。借助百度搜索isHexDigit异常,

发现原来,是escape()方法造成了异常,同时了解了浏览器传递地址的一些原理,在浏览器地址栏里,浏览器认为%是个转义字符,浏览器会把%与%之间的编码,两位两位取出后进行解码,然后再传递给处理页面,

然后由处理页面进行再次解码。由此我想到一直使用encodeURI方法是正确的,只是需要使用两次encodeURI方法,例如encodeURI(encodeURI("中文"));第一次是把中文编码成%xy的格式,

第二次是对%xy中的%进行编码,%编码成%25。整个传参过程大体应该是:提交页面使用encodeURI(encodeURI("中文"))编码,把最后的编码结果%25xy传递给处理页面的过程中,浏览器获取URL地址

(注意openModelDialog方法,浏览器获取不到参数编码)后解码成%xy,然后把%xy传递给处理页面,处理页面使用URLDecoderdecode(requestgetParameter("参数名"),"UTF-8");完成解码。

总结:1、汉字出现在URL路径部分的时候不需要编码解码;

2、使用encodeURI进行2次编码;

3、在openModelDialog()打开的模式窗体里没办法用requestgetParameter正确获取参数;

客户端和服务器在传递数据时可以用过滤器filter解决字符编码问题,但filter只能解决post方式提交的数据。对于get方式,可以使用两次encodeURI(encodeURI(中文))并在服务器中使用URLDecoderdecode(中文, "UTF-8");

今天用Ajax校验数据时也遇到这个问题,尽管页面、类和web容器都统一了字符编码,提交的数据依然是乱码,所以就采用了2次encodeURI()编码方式,乱码问题就解决了。

如果你是用记事本打开的json,点击文件-另存为,编码选utf-8

其他的编辑器也会有编码的选项,你找下吧

刷新页面前记得要先清除缓存

能否详细一点,提交表单,传的中文参数吗?如果是的话那是后台获取的这个参数乱码了?如果是的话那你试试这个 String name = new String(namegetByte("iso-8859-1"),"GBK");中文在传输过程中是按照iso-8859-1的格式传输的; 再看看你的项目中的编码格式是不是GBK

乱码问题描述的太不清楚了,最好贴出代码

以上就是关于AJAX服务器端发送GB2312中文字符,客户端如何处理才能不显示乱码全部的内容,包括:AJAX服务器端发送GB2312中文字符,客户端如何处理才能不显示乱码、Ajax传递中文参数到后台乱码的有效解决方法、ajax用post的方式传中文字符,结果是乱码要怎么解决(php文件是gb2312编码)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9790867.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存