设为首页 收藏本站
查看: 803|回复: 0

[经验分享] web程序乱码深入分析【基础原理篇】--php为例

[复制链接]
发表于 2017-4-9 13:49:50 | 显示全部楼层 |阅读模式
http://www.cnblogs.com/chengmo/archive/2010/10/18/1854755.html





web程序乱码深入分析【基础原理篇】--php为例
  做web应用程序开发也有很多年了,前后涉及有,asp,asp.net,jsp,php 。尽管语言都不相同,在日常开发中,无论那门语言都出现过,浏览器端的乱码问题。 出现了,都会手忙脚乱一阵,上网查资料,一页一页看。 还有些紧张,因为boss可能还等着解决问题呢。 想必这些情况,做web开发的同人也是经常遇到的。 下面要讲的是比较原理性的,我想如果对于乱码产生原因找到了,以后出现类似问题。按照原理推论,一定也会很快解决。 (以下说明文件,都是以文本文件说明)
  一、文本文件编码是什么?
   
  A、文本文件编码存在哪里了呢?
  我们知道,计算机存储文件,最终都是以二进制保存的,通过流方式读取任何文件,得到是8位的字节流。一个文件生成了,同时也确定了它的编码了。 以下通过软件:winhex比较说明:
  通过使用记事本:输入“中”,另存为时候,分别选择:utf-8,unicode,ansi编码。我们通过winhex打开比较下。
DSC0000.png

  utf-8:EF BB BFE4 B8 AD 6字节
  unicode:FF FE2D 4E 4字节
  ansi(gb2312):D6 D0  2字节
  同一个汉字中,保存为文件后,实质存储的字节码各不相同。
  这里我们一定想到一个问题,读取该文件的软件打开这个文件,怎么都可以显示出:“中”呢? 
  如果我们继续思考下就会想到: 这个文本文件的编码是不是存在文件属性中了呢?
  答案是:查看属性没有任何不同
  那文件编码存在:文件的字节码里面了?
  哈哈,我也是这么想的,通过查阅资料知道,unicode码可以指定一个bom(顺序头),unicode常见表现形式有:utf-8,utf-16 顺序头不一样,因此很多软件可以通过这个标记来区分文件是什么编码了。 上面例子,utf-8头是:EFBBBF,unicode LE是:FFFE.
  是不是所有文件编码都会写入到文件字节码里面呢?
  如果真的这样的话,那么问题就简单了。所有应用程序读文本文件时候,读一下标记,那么就知道它是什么编码。 其实,除了unicode有bom这个特殊头外,其它编码可没有呢。 看到刚才那个:ansi(gb2312)编码了吗,值是:D6D0 刚才是“中” 在gb2312编码表中的代号。
   
  B、怎么样获得文件编码呢?
  上个例子中,我们知道,文本文件编码不可能都保存在文件字节码中。 那么,应用程序读取文件怎么样判断编码呢?
DSC0001.png

  我们用:zend 工具,以EUC-JP生成一个文件,内容是:”中” ,通过:winHEX查看该文件,它的字节码是:C3 E6 。可以看到同样都是:"中” gb2312保存文件,得到字节码是:D6 D0 .
  我用windows 记事本打开:2个文件看一下:
DSC0002.png

  怎么我文件内容是:”中“,用euc_jp编码保存后,用记事本打开,看到是:”面“ 了呢? 是不是windows 记事本有问题呢?
  记事本没有任何问题,windows 记事本在打开文本文件时候,会先判断bom类标记,如果发现文本文件存在该标记。那么,就能够知道它对应的编码了。然后,将字节流转换为对应编码字符串。 这样显示正常保存时候内容。
  如果,没有bom头标记的文本,记事本程序,就默认当:ANSI编码处理了(在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码),在简体中文下,ANSI对应是:gb2312。因此,记事本把”C3E6”当作gb2312处理。 C3E6在gb2312编码表中对应是汉字:“面” 了。
  文本文件,保存时候存储编码,与读出时候设置编码,如果不统一,就会造成乱码!
  二、php引擎怎么样获得我的文件编码
  其实,这里说php引擎处理编码,与记事本识别编码基本是相同的。发现能够识别编码就识别,不能识别编码就按照:
  php.in 中
  default_charset = "iso-8859-1"
  default_charset 指定编码处理了,默认是:iso-8859-1。
  这里啰嗦一下,现在很多应用程序都会用:"iso-8859-1" 作为默认编码,jsp也是这样的。它的优点大家应该可以理解:iso-8859-1(EASCII 扩展ASCII编码)以ASCII为基础,在空置的0xA0-0xFF的范围内,加入96个字母及符号,藉以供使用附加符号的拉丁字母语言使用。用一个8位字符可以表示任意字符集。在程序开发中,我们常用的变量,都会是英文字符空格之类,这些都会在解析时候保持原来不变。而对于的中文字符,都会是多字节的。iso-8859-1解析后,会变成一些西欧字符。 但是实际上,并不会影响程序任何逻辑。 因为那些乱七八糟的西欧字符,只是一些注释,或者值而已。 程序语法完全没有破坏!!
  处理完的结果它还是字节流,准备发送给浏览器。
  三、浏览器怎么样获得服务端的编码
  这里我们知道,浏览器得到web服务端返回的文件流,默认是:iso-8859-1 字节码。其实可以看作是与原始存文件流的字节码是相同的。
  浏览器也是一个软件,它获得了字节流,它从那里知道字节流是什么编码呢?
  这里有几种形式:
  A、HTTP resposne头告知编码
  以下是:访问:baidu.com httpwatch 抓包图:
DSC0003.png

  我们只抓取了:Stream这个选项卡,可以通过这里看到,右下返回内容是乱码,其实这些就是服务器返回字节流。 再往上看: DSC0004.png 这里有个:charset。 哈哈,它就是服务端返回给浏览器的一个编码。浏览器通过这个编码就能够知道用什么编码类解析该字节流了。 注意,返回charset编码,一定要与该文件流保存编码一致。否则一样乱码!
  B、通过html源码,meta头告知
  并不是所有服务器端程序都会,都是很么按章出牌,告知自己流编码。很多时候,php开发人员没有加入:
  header("Content-type:text/xml;charset=字符编码"); 那么浏览器还有其它方法处理吗?
DSC0005.png

  如果meta头指定了,浏览器也一样知道编码是什么了。
  C、有一些问题:
  如果header,meta两个个都指定了以那个为准呢?
  测试表明,以http 协议中,response 头里面的charset为主。 会忽视掉,meta指定。
  如果header,meta两个都没有指定,会出现什么情况呢?
  这个时候,就像上面例子里面的记事本了。 会怎么出现依据浏览器自己本身设置默认编码。如果你文件刚好是:gb2312编写,查看浏览器默认编码刚好也是:gb2312,那么你的中文字符显示正常。如果换上一个默认字符不一样,就会出现乱码情况。 这种情况,估计做web开发同人经常会遇到吧!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362476-1-1.html 上篇帖子: PHP中this self parent三个应用说明 下篇帖子: Uchome 所用程序通用方法汇总function_common.php
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表