php的各种编码问题

写这篇文章实在是因为跨平台的编码问题很让人头疼,我在做这次项目时候碰到诸多关于编码,乱码的问题,收集起来都看看,以防止以后的碰到问题的时候来弄下:

1.何为编码:每一种文件,每一个OS,每一个WEB,每一个DB,都有的一种属于自己的编码方式,在国际编码未统一时候,中文简体是采用的GBK或者是GB2312的编码模式,英文采用的UTF-8的编码模式,因此,常常会出现乱码的问题,什么乱码的问题呢?乱码的问题好比是,比如说,一个中国人,什么英语都不会,却跑到美国的华尔街去,说着一口流利的中文与人交流,没有一个人能明白他在说什么,这就是乱码问题。做一个官方的解释吧,比如说,一个字符串在某一个平台下是通过某种方式编码的,但是,当我们用某些方法(比如读取文件,连接数据库之类)将在这个平台上的编码模式读取出来并且展示到另一个平台上(比如浏览器,手机客户端,其他的操作系统的时候),如果被展示平台的编码模式同原来的平台的编码模式不同的时候,就会产生乱码的问题。比如,如果说,从GBK编码模式的MYSQL数据库中提取数据并输出到网页前端的时候,如果网页的帧头是认为utf-8输出的话,必然会产生乱码。

 

2.如何解决乱码问题,一个不懂英文的中国人到美国,如何与美国人沟通呢?,当然是找一个翻译,能将他说的话翻译成为中文。所以,解决乱码的问题,我们要怎么做呢?那就是转码,比如上述所讲的问题,我们要把从MYSQL的读到的数据变成UTF-8的编码模式后,再在网页上进行输出,那就不会乱码了。也就是说,我们要么把GBK的模式转换成为UTF-8的模式,要么我们的MYSQL的编码模式就是UTF-8。所以,解决乱码问题,两种方法,转码,或者,统一编码。

 

3.项目中碰到的例子:

     APhpjson_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,结果在因为phpecho输出未指明编码模式,Chrome浏览器默认输出GBK编码,于是我认为没有问题,但是,如果你在phpecho输出之前加入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.在几个月前的计算机网络设计中,也是出现了乱码的问题,不过这次的服务器是PCwin7系统的,我现在明白乱码的问题的是:PCeclipse的环境的就是GBK编码模式的,但是在安卓上又没有进行转码: BufferedReader m_bufferedreader=new BufferedReader(new InputStreamReader(m_inputstream,encode));如果encode=GBK”,则不出现乱码问题,如果encode=utf-8”,则出现乱码问题,这个javaIO类的构造参数是,以什么形式来解码,所以encode=gbk”就可以了,因为win7是默认GBK的,(这是中国人的习惯);.

  

 

 

 

  综上所述,我们得到几个结论:乱码现象是一种不同字符编码在相同模式下,未能转码成功而形成的,所以我们要注意,以后在项目中,IDE的文件,数据库的编码,WEB,最好都统一输出为

UTF-8;要不就记得去转码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值