编程乱码问题初步探索_PHP_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > PHP > 编程乱码问题初步探索

编程乱码问题初步探索

 2011/8/24 8:11:54  yinhe2726  http://yinhe2726.iteye.com  我要评论(0)
  • 摘要:[分享]编程乱码问题初步探索作者:马顺仁相信很多朋友在写程序的过程中都受到过乱码的骚扰,那么今天我就这个问题来同大家探讨一下。乱码的问题分为很多种,很多人一见到有乱码就开始骂mysql,其实很多情况下并不是mysql造成的。从乱码产生的原因来分析,乱码的产生一般有以下几种情况。1、网页编码与程序编码不一致的问题所谓的网页编码问题就是指你的html代码中定义的“charset”,例如以下这段代码:1<head>23<title>
  • 标签:问题 乱码问题 编程

[分享]编程乱码问题初步探索

作者:马顺仁

相信很多朋友在写程序的过程中都受到过乱码的骚扰,那么今天我就这个问题来同大家探讨一

下。

乱码的问题分为很多种,很多人一见到有乱码就开始骂mysql,其实很多情况下并不是mysql造

成的。

从乱码产生的原因来分析,乱码的产生一般有以下几种情况。

1、网页编码与程序编码不一致的问题

所谓的网页编码问题就是指你的html代码中定义的“ charset” ,例如以下这段代码:

 1 <head>
 2 
 3 <title>Chat Tutorial Application</title>
 4 
 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 6 
 7 <meta name="language" content="en" />
 8 
 9 <meta name="author" content="Padraic Brady" />
10 
11 <link rel="stylesheet" href="public/styles/chat.css" type="text/css" />
12 
13 <script src="public/javascript/scriptaculous/lib/prototype.js"
14 
15 type="text/javascript"></script>
16 
17 <script src="public/javascript/scriptaculous/src/scriptaculous.js"
18 
19 type="text/javascript"></script>
20 
21 <script src="javascript/chat.js" type="text/javascript"></script>
22 
23 </head>

  

他设置了浏览器端采用gb2312的字符集,此时如果程序使用的是utf8的编码(就是指以什么样

的编码来编写的程序,一般在编辑器中设置),那么就会产生乱码。

此时的解决方法就是把charset的值改为utf8

2、代码本身就存在乱码问题

这种情况是指你的代码本身就存在乱码问题。造成这种情况的原因一般是你以另一种编码格式

修改了你的代码后并做了保存,这样你的程序中就有几种编码形式的代码,那么输出的时候自然就

会有乱码。 这类问题相对来说比较容易解决, 只要人工找到那段有乱码的代码, 然后修改就行了 (很

多编辑器可以完成这个工作)。

3、mysql 的问题(此次讨论仅围绕mysql5.0 之后的版本展开)

现在再来看最容易造成乱码,也是最容易让人迷糊的mysql乱码问题。

要说mysql乱码,得先从mysql的几个参数说起,从mysql5开始,多了几个设置字符集的系统变

量:

character_set_client 客户端字符集

character_set_connection 客户端与服务器端连接采用的字符集

character_set_results SELECT查询返回数据的字符集

character_set_database 数据库采用的字符集

乱码问题一般是由于以上几个变量设置错误造成的,很多人在请教乱码问题的时候,一般都会

得到一个这样的答案:“ 你先set names一下” 。

那么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=?"/>一致。

捍卫自己的梦想! 原文地址:http://www.cnblogs.com/c3055/archive/2011/08/13/2137455.html
发表评论
用户名: 匿名