编程乱码问题初步探索

相信很多朋友在写程序的过程中都受到过乱码的骚扰,那么今天我就这个问题来同大家探讨一下。
乱码的问题分为很多种,很多人一见到有乱码就开始骂mysql,其实很多情况下并不是 mysql造成的。
从乱码产生的原因来分析,乱码的产生一般有以下几种情况。
1
所谓的网页编码问题就是指你的html代码中定义的“ charset”,例如以下这段代码:
<head>
<title>Chat TutorialApplication</title>
<metahttp-equiv="Content-Type" content="text/html; charset=UTF-8" />
<metaname="language" content="en" />
<metaname="author" content="PadraicBrady" />
<link rel="stylesheet" href="public/styles/chat.css" type="text/ css"/>
<script src="public/javascript/scriptaculous/lib/prototype.js"type="text/ javascript"></script>
<script src="public/javascript/scriptaculous/src/scriptaculous.js"type="text/ javascript"></script>
<script src="javascript/chat.js" type="text/javascript"></script>
</head>
他设置了浏览器端采用 gb2312的字符集,此时如果程序使用的是utf8的编码(就是指以什么样的编码来编写的程序,一般在编辑器中设置),那么就会产生乱码。
此时的解决方法就是把charset的值改为 utf8。
2
这种情况是指你的代码本身就存在乱码问题。照成这种情况的原因一般是你以另一种编码格式修改了你的代码后并做了保存,这样你的程序中就有几种编码形式的代码,那么输出的时候自然就会有乱码。这类问题相对来说比较容易解决,只要人工找到那段有乱码的代码,然后修改就行了(很多编辑器可以完成这个工作)。
3SELECT 查询返回数据的字符集
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库,相信应该不影响阅读):
<?
//
//
if (substr($version, 0, 1) > 4)
{
//
$sql = 'SELECT @@ character_set_database';
$char= current($db->fetch_one($sql));
//character_set_client= "' . $ char . '"');
$db->query('SET @@ character_set_connection= "' . $ char . '"');
//character_set_results= "' . $ program_char . '"');
}
?>
到此应该就可以解决绝大多数我们遇到的乱码问题了,另外还必须强调的是,有时候乱码的出现有可能是以上几种原因混合造成的。
对于这样的问题处理起来就比较的麻烦。因为首先要保证你在数据库中保存的数据的字符集与数据库的字符集是一致的。如果你在一个utf8的数据库中保存了 GBK字符数据(如果你页面的编码与数据库的编码不一致,那么产生这个问题的可能性就很大),那么假设以上的设置都正确,结果还是会出现乱码的问题。不过这类问题一旦确定了产生的原因,那么就还是有办法解决的,比如刚才我举的这个例子。
我们如果能确保其他环节的设置都是正确的,并且能够确认是由于把gbk的数据存到了 utf8的
数据库中而造成的乱码,那么我就可以把这些数据从数据库中取出来之后再用iconv ()转换编码也是可以的。
总而言之,我们应当尽量的保证数据库中的数据是正确的,那么问题处理起来就相对简单了。
说了一大堆可能把你给弄迷糊了,我将其总结为以下四点,便于大家记忆。
1character_set_client , character_set_connection与 character_set_database一致;
3<metahttp-equiv="Content-Type" content="text/html; charset=? "/>一致。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值