浏览器,PHP, MYSQL字符编码的一些记录

本文介绍了一种解决PHP应用中Unicode与GB2312编码不匹配导致的中文乱码问题的方法,并提供了具体的代码示例。

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

    以前PHP/MYSQL的时候就耳闻过一些中文编码的问题,不过一直都是前后统一的Unicode编码,所以也没遇到太多问题。这次正式入职,公司MYSQL使用的是gb2312的字符集,因此在插入中文的时候也遇到了一些问题。

       插入流程: 
      1、前台发起添加数据请求,数据中包含中文,编码为Unicode;
      2、后台PHP脚本通过$_POST获得中文数据,接着直接插入到数据库中类型为text的字段;
      插入结果:数据库中的字段显示的中文为乱码。
     此时想当然的以为存储的字符串是以字节流形式保存,读取的时候根据编码转换就行

     查询流程:
     在数据库字段中文乱码的情况下,PHP脚本获得相关字段,此时直接输出页面依然为乱码;
     结果:彻底推翻了插入流程时的想法。

为此做了一个简单的测试demo:

数据库:test, 数据表:test只包含一个类型为text的des字段
test.html页面代码如下: 
<input id="send" type="button" value="send" />
<input id="show" type="button" value="show" />
<script>
     document.getElementById('send').onclick function(){
           var xhr = new XMLHttpRequest();
           var param encodeURIComponent("啊啊啊");
           xhr.open('post','test.php'true);
          xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");
           xhr.send('des='+param);
     };
     
     document.getElementById('show').onclick function(){
           var xhr = new XMLHttpRequest();
           xhr.onload function(){
                alert(xhr.responseText);
           }
           xhr.open('post','test.php'true);
           xhr.send(null);
     };
</script>    
      
send按钮用post方法提交数据,show按钮则查询数据。

test.php页面代码如下:
$db_host = '127.0.0.1';
$user = 'root';
$pwd = '';
$conn mysql_connect($db_host$user$pwd);
$database mysql_select_db('test'$conn);
if(isset($_POST['des'])){
     $sql = "INSERT INTO `test` VALUES ('$_POST[des]')";
     $query mysql_query($sql);
else {
     $sql = "select * from `test`";
     $query mysql_query($sql);
     $result mysql_fetch_array ($query);
     echo $result[0];
}
  

也就是根据请求字段判断是插入操作还是查询操作。

对应前面描述的插入流程与查询流程。


解决方案:
在操作数据前加入一句:mysql_set_charset('gb2312');
同时用iconv将字符串转为gb2312编码。
这样数据库的字段就正常了~~,同时查询出来的中文字段也正常了~

不过具体原理有待搞明白。

上面只是主要问题中的一个,接下来的问题则是json_encode的问题:
由于取出的字符串编码不是Unicode,而json_encode只能对Unicode进行编码,因此对于非Unicode字符串,只会编码为null。
因此还需要用iconv将字符串转为utf8编码,才能用json_encode。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值