设为首页
加为收藏
联系我们
  • 电子商务
  • 软件网络
  • 看天下
  • 营销财经
  • 关闭导航
  • 网络编程
  • 数据库类
  • 关闭导航
  • 网络编程
  • 社交礼仪
  • 数据库类
  • 人文地理
  • 关闭导航
  • 编程工具
  • 电子书籍
  • 关闭导航
  • 生活休闲
  • 演讲讲座
  • 视频教程
  • 经典影视
  • 关闭导航
  • 您的位置: 首页 > 入门教程 > 网络编程 > PHP

    乱码问题探究与总结

    时间: 2008-10-02  信息来源: 博客园  作者: 编辑整理  点击数:

    内容提示:本文将就编程乱码问题做一些探讨并对一些典型问题做一些总结.

        很多情况下,这样设置了之后就能把乱码问题解决了。但是还是不能完全避免出现乱码的可能,
    为什么呢?

            因为character_set_client,character_set_connection这两个变量仅用与保证与
    character_set_database编码的一致,而character_set_results则用与保证SELECT返回的结果与
    程序的编码一致。

            例如,你的数据库(character_set_database)用的是utf8的字符集,那么你就要保证
    character_set_client,character_set_connection也是utf8的字符集。而你的程序也许采用的并
    不是utf8,比如你的程序用的是gbk,那么你若把character_set_results也设置为utf8的话就会出
    现乱码问题。此时你应该把character_set_results设置为gbk。这样就能保证数据库返回的结果与
    你的程序的编码一致。

            下面我给出一段用于设置字符集的代码(其中用到了一个我自己写的db库,相信应该不影响阅
    读):

           <?
          //假设我们的程序采用的是utf8的字符集
          $program_char = 'utf8';
          //先检查mysql的版本号,如果版本号大于4我们才可以设置这些系统变量(mysql4还没有这些系统变
          量)
          $version = current($db->fetch_one('SELECT VERSION()'));
          if (substr($version, 0, 1) > 4)
            {
              //取出当前数据库的字符集
              $sql = 'SELECT @@character_set_database';
              $char = current($db->fetch_one($sql));
              //将客户端字符集(character_set_client)和连接字符集(character_set_connection)
            设置为与数据库字符集(character_set_database)一致
              $db->query('SET @@character_set_client = "' . $char . '"');
              $db->query('SET @@character_set_connection = "' . $char . '"');
              //将SELECT查询返回数据的字符集设置为与当前程序的字符集一致
              $db->query('SET @@character_set_results = "' . $program_char . '"');
            }
          ?>

           到此应该就可以解决绝大多数我们遇到的乱码问题了,另外还必须强调的是,有时候乱码的出
    现有可能是以上几种原因混合造成的。

             对于这样的问题处理起来就比较的麻烦。因为首先要保证你在数据库中保存的数据的字符集与 数据库的字符集是一致的。如果你在一个utf8的数据库中保存了GBK字符数据 (如果你页面的编码 与数据库的编码不一致,那么产生这个问题的可能性就很大),那么假设以上的设置都正确,结果 还是会出现乱码的问题。不过这类问题一旦确定了产生的原因,那么就还是有办法解决的,比如刚 才我举的这个例子。

            我们如果能确保其他环节的设置都是正确的,并且能够确认是由于把gbk的数据存到了utf8的
    数据库中而造成的乱码,那么我就可以把这些数据从数据库中取出来之后再用iconv()转换编码也
    是可以的。

            总而言之,我们应当尽量的保证数据库中的数据是正确的,那么问题处理起来就相对简单了。

           说了一大堆可能把你给弄迷糊了,我将其总结为以下四点,便于大家记忆:
          1、要保证数据库中存的数据与数据库编码一致,即数据编码与character_set_database一致;
          2、要保证通讯的字符集与数据库的字符集一致,即character_set_client, character_set_connection与character_set_database一致;
          3、要保证SELECT的返回与程序的编码一致,即character_set_results与程序编码一致;
          4、要保证程序编码与浏览器编码一致,即程序编码与<metahttp-equiv="Content-Type" content="text/html;charset ?"/>一致。

     
    Tags: PHP,编程,乱码 责任编辑:aboutstudy
     
      关于我们 友情链接 网站地图 广告服务 联系我们 管理登陆  
      鄂ICP备07014143号  
      Powered by EmpireCMS 5.0  
      Template designed by 直来直往.
      联系信息: QQ 365931563 Email:jiangtian001@sina.com  
      ©CopyRight 2007-2008, SKDE.CN, Inc. All Rights Reserved