乱码产生的原因
相信很多朋友在写程序的过程中都受到过乱码的骚扰,那么今天我就这个问题来同大家探讨一下。
乱码的问题分为很多种,很多人一见到有乱码就开始骂mysql,其实很多情况下并不是mysql造成的。
从乱码产生的原因来分析,乱码的产生一般有以下几种情况。
1、网页编码与程序编码不一致的问题
所谓的网页编码问题就是指你的html代码中定义的“charset”,例如以下这段代码:
他设置了浏览器端采用GB2312的字符集,此时如果程序使用的是UTF-8的编码(就是指以什么样的编码来编写的程序,一般在编辑器中设置),那么就会产生乱码。
此时的解决方法就是把charset的值改为UTF-8
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'
很多情况下,这样设置了之后就能把乱码问题解决了。但是还是不能完全避免出现乱码的可能,为什么呢?
网友评论