• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

编程乱码问题初步探索

发布: 2008-2-03 14:23 | 作者: 马顺仁 | 来源: 《PHPer》 | 查看: 33次 | 进入软件测试论坛讨论

领测软件测试网

那么set names是什么呢? set names实际上就是同时设置了character_set_client,character_set_connection,character_set_results这三个系统变量。

  例如set names 'gbk'等同于:

set @@character_set_client = 'gbk'

set @@character_set_connection = 'gbk'

set @@character_set_results = 'gbk'

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

  因为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、要保证程序编码与浏览器编码一致,即程序编码与<meta http-equiv="Content-Type" content="text/html; charset=?"/>一致。

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/

22/2<12

关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网