写这篇文章实在是因为跨平台的编码问题很让人头疼,我在做这次项目时候碰到诸多关于编码,乱码的问题,收集起来都看看,以防止以后的碰到问题的时候来弄下:
1.何为编码:每一种文件,每一个OS,每一个WEB,每一个DB,都有的一种属于自己的编码方式,在国际编码未统一时候,中文简体是采用的GBK或者是GB2312的编码模式,英文采用的UTF-8的编码模式,因此,常常会出现乱码的问题,什么乱码的问题呢?乱码的问题好比是,比如说,一个中国人,什么英语都不会,却跑到美国的华尔街去,说着一口流利的中文与人交流,没有一个人能明白他在说什么,这就是乱码问题。做一个官方的解释吧,比如说,一个字符串在某一个平台下是通过某种方式编码的,但是,当我们用某些方法(比如读取文件,连接数据库之类)将在这个平台上的编码模式读取出来并且展示到另一个平台上(比如浏览器,手机客户端,其他的操作系统的时候),如果被展示平台的编码模式同原来的平台的编码模式不同的时候,就会产生乱码的问题。比如,如果说,从GBK编码模式的MYSQL数据库中提取数据并输出到网页前端的时候,如果网页的帧头是认为utf-8输出的话,必然会产生乱码。
2.如何解决乱码问题,一个不懂英文的中国人到美国,如何与美国人沟通呢?,当然是找一个翻译,能将他说的话翻译成为中文。所以,解决乱码的问题,我们要怎么做呢?那就是转码,比如上述所讲的问题,我们要把从MYSQL的读到的数据变成UTF-8的编码模式后,再在网页上进行输出,那就不会乱码了。也就是说,我们要么把GBK的模式转换成为UTF-8的模式,要么我们的MYSQL的编码模式就是UTF-8。所以,解决乱码问题,两种方法,转码,或者,统一编码。
3.项目中碰到的例子:
A。Php的json_encdoe()的中文输出乱码现象。
$testJSON=array('name'=>"廖志伟",'value'=>"test");
如果直接将这个键值对数组转化成为json_encode().那么echo之后什么也没有,我们要怎么做呢,网上很多方法是先转化成为utf-8,编码模式,但是,这样输出的json的数据就是一串奇葩的文字,查询之后,我得到,这是unicode字符,因此,这种方式也是不可寻的。如何改变呢?
foreach($testJSON as $key=>$value)
{
$testJSON[$key]=urlencode($value);
}
echo urldecode(json_encode($testJSON));
先将数组中的每一个字符都转换成为域名编码模式,在json转码,echo输出的时候再域名解码,就能输出中文了!。
这里注意一个问题:foreach($testJSON as $key =>$value) 是通过指针来找到数组中的值,并且改变编码模式,但是foreach($testJSON as $value) 就是没有改变数组的内容的,这好比初学C语言的时候得到的传递参数还是传递指针的问题。
B。从数据库中读取数据的时候,开始并未意识到会乱码的问题,但是,后来才明白,我的MYSQL数据库初始建立的时候,选择的是中文的编码模式,GBK,结果在因为php的echo输出未指明编码模式,Chrome浏览器默认输出GBK编码,于是我认为没有问题,但是,如果你在php的echo输出之前加入header(“conetent-Type:text/html; charset=utf-8”)(指明帧头的编码模式),整个网页都会输出乱码的问题。
所以,这里一种解决方法是,我们重建数据库,将数库的编码方式改成的UTF-8的模式,要不我们就每次在php的输出帧头加上header(“content-Type:text/html ; charset=gb2312”);
C.在本次项目中,android客户端的请求php的网页,加载POST的参数,用到了
UrlEncodedFormEntity post_entity=new UrlEncodedFormEntity(list,"utf-8")
这个类来封GB装参数,结果发现数据库中全部都是乱码的现象,很头痛,先查阅AndroidSDK文档的,明白这个类的第二个构造参数的意思是以什么形编码式封装POST的表单,在服务器上的php上得到的网页上其实是没有乱码的,这是因为post的表单起始没有编码的问题存在,但是为什么数据库中会插入的乱码的数据呢?经过反复的调试,因为数据库的编码模式的GBK,但是提交到服务器的是utf-8的编码,服务器网页得到数据的时候都没有乱码,乱码的关键在于插入数据库的表中的时候,出现了这个现象。所以,我们需要修改一下构造参数:UrlEncodedFormEntity post_entity=new UrlEncodedFormEntity(list,"gb2312"),这样就不会乱码了。
D.本来认为UTF-8的是中文编码模式的,于是,直接header(“content-Type:text/html ; charset=utf-8”)后,认为可以输出,结果又一次得到乱码,于是很不解,后来才明白了一个问题,我的IDE的默认编码是gbk的,于是我改动了IDE的文件的编码方式为utf-8,于是便不会出现乱码了。这个问题告诉我们,直接从文件上输出的字符串是文件本身的编码的模式。
E.在几个月前的计算机网络设计中,也是出现了乱码的问题,不过这次的服务器是PC,win7系统的,我现在明白乱码的问题的是:PC的eclipse的环境的就是GBK编码模式的,但是在安卓上又没有进行转码: BufferedReader m_bufferedreader=new BufferedReader(new InputStreamReader(m_inputstream,encode));如果encode=“GBK”,则不出现乱码问题,如果encode=“utf-8”,则出现乱码问题,这个java的IO类的构造参数是,以什么形式来解码,所以encode=“gbk”就可以了,因为win7是默认GBK的,(这是中国人的习惯);.
综上所述,我们得到几个结论:乱码现象是一种不同字符编码在相同模式下,未能转码成功而形成的,所以我们要注意,以后在项目中,IDE的文件,数据库的编码,WEB,最好都统一输出为
UTF-8;要不就记得去转码