开发者社区> 技术小胖子> 正文

用ajax提交表单时中文乱码解决方案

简介:
+关注继续查看
掉坑里了,遭遇到了js与PHP对表单中中文编码、解码方法不统一的问题。
当年上学的时候,对ms很是不屑,总是想玩一些与众不同的东西,玩linux、freebsd,玩opera,玩C++builder。当我做了一个网络开发者,才发现自己曾经是多么的幼稚,才开始怀念IE一统天下的那段美好时光。做一个网络开发者最大的苦恼是什么?对我来说这个问题的答案是:不统一的标准。如果你也经历过下面这些事情,我想你会同意我的看法:
一个在IE下看起来很正常很美观的页面,在其它的浏览器中却一踏糊涂,反之亦然;
一段在IE下工作得很完美的js代码,在其它的浏览器中却一点反应都没有,反之亦然;
......
也许个性真的是学生才能玩的东西。
不说废话了,说说我遇到的这个问题吧。要做一个无刷新的评论,类似于discuz5.5中的无刷新回帖。在提交表单的时候遇到了问题,通过ajax提交到处理脚本的中文字符串被转成了utf-8的格式,于是在往数据库里执行插入的时候出现了乱码。搜了一把却没有发现解决方案,于是开始自己摸索,摸索的过程中写了下面的函数:

//将类似'%D5%E2%D5%E2%D5%E2%D5%E2%D5%E2%D5%E2'解码,返回一个正常的字符串
function chardecode($str,$sep='%')
{
 $string = str_replace($sep,'',$str);
 $len = strlen($string);
 $strdecode = '';
 for ($i=0;$i<$len;$i+=2){
  $num1 = substr($string,$i,2);
  $num1 = hexdec($num1);
  $i+=2;
  $num2 = substr($string,$i,2);
  $num2 = hexdec($num2);
  $strdecode .= chr($num1).chr($num2);
 }
 return $strdecode;
}
其实这个函数的作用类似于urlencode(),比它强的地方在于可以自己设置每个字符间的分隔符。代码已经足够简单了,用到了两个不太常用的函数,hexdex()和chr()。前者的作用是将一个16进制的数字转换成10进制,后者是将一个数字转换成对应的aiscII字符。
然而这个函数并没能帮我解决问题,乱码依旧。其实解决这个问题主要难点是发现问题到底出在哪里,我并不是一上来就发现中文字符被转成了utf-8格式,只能一点点的摸索,找到了原因这个问题也就不难解决了。
这里用的是pnews里的一个utf-8转gb2312的函数,放出来与大家共享:
function u2g( $instr ) {
 $fp = fopen( '../language/unicode-gb.tab', 'r' );
 $len = strlen($instr);
 $outstr = '';
 for( $i = $x = 0 ; $i < $len ; $i++ ) {
  $b1 = ord($instr[$i]);
  if( $b1 < 0x80 ) {
   $outstr[$x++] = chr($b1);
#   printf( "[%02X]", $b1);
  }
  elseif( $b1 >= 224 ) { # 3 bytes UTF-8
   $b1 -= 224;
   $b2 = ord($instr[$i+1]) - 128;
   $b3 = ord($instr[$i+2]) - 128;
   $i += 2;
   $uc = $b1 * 4096 + $b2 * 64 + $b3 ;
   fseek( $fp, $uc * 2 );
   $gb = fread( $fp, 2 );
   $outstr[$x++] = $gb[0];
   $outstr[$x++] = $gb[1];
#   printf( "[%02X%02X]", ord($gb[0]), ord($gb[1]));
  }
  elseif( $b1 >= 192 ) { # 2 bytes UTF-8
   printf( "[%02X%02X]", $b1, ord($instr[$i+1]) );
   $b1 -= 192;
   $b2 = ord($instr[$i]) - 128;
   $i++;
   $uc = $b1 * 64 + $b2 ;
   fseek( $fp, $uc * 2 );
   $gb = fread( $fp, 2 );
   $outstr[$x++] = $gb[0];
   $outstr[$x++] = $gb[1];
#   printf( "[%02X%02X]", ord($gb[0]), ord($gb[1]));
  }
 }
 fclose($fp);
 if( $instr != '' ) {
#  echo '##' . $instr . " becomes " . join( '', $outstr) . "<br>n";
  return join( '', $outstr);
 }
}
注意函数中用到了一个码表:unicode-gb.tab,附件中的就是了。使用的时候你得根据实际情况把函数中的第一句改成码表实际存放的位置。

     本文转自wfyang 51CTO博客,原文链接:http://blog.51cto.com/wfyang/28751,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
编码gbk ajax的提交
客户端 服务器端:
478 0
Python mapfinance库②中文标题乱码 与 显示负数 解决方案
Python mapfinance库②中文标题乱码 与 显示负数 解决方案
47 0
gdy
转载:Ununtu下中文乱码解决方案
转载: 添加中文字符编码: $sudo vim /var/lib/locales/supported.d/local #添加下面的中文字符集 zh_CN.GBK GBK zh_CN.GB2312 GB2312 zh_CN.
813 0
AJAX中文传值乱码问题解决方法
在软件开发过 程中,乱码问题一直都是我们最头痛的事,页面的编码,开发环境的编码,数据库的编码,有一个不一致都有可能导致乱码问题的发生;有的很好解决,有的很棘 手;当你使用AJAX技术时,为调用的后台方法传值是必不可少的,英文和数字还好解决,一般不会出现乱码,介是如果是要传中文的字符呢?很容易就会乱掉, 因为在你使用编码的时候一般会默认:BG2312,而Ajax默认使用的是UTF
1449 0
Mac mysql 解决中文乱码
Mac mysql 解决中文乱码问题 出现“???”之类的无法识别的乱码 到/etc目录下自己建一个my.cnf文件(需要最高权限,使用sudo su),然后写入内容: [client] default-character-set=utf8 [mysqld] character-set-server=utf8 保存,修改。
1055 0
直播|超大型系统的持续集成与持续交付的解决方案及案例分析
人人都在谈敏捷开发的时代,大型系统要保证产品质量,实现快速迭代却变得不易。那么大型系统如何实现持续集成持续交付,进行产品迭代发布呢?9月7日20:00 阿里巴巴高级测试开发专家_鲁小川,将在云栖社区为大家带来解决方案!
3850 0
21114
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载