
大多数的客户端都采用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编码)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)