`

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

    博客分类:
  • php
阅读更多


做web应用程序开发也有很多年了,前后涉及有,asp,asp.net,jsp,php 。尽管语言都不相同,在日常开发中,无论那门语言都出现过,浏览器端的乱码问题。 出现了,都会手忙脚乱一阵,上网查资料,一页一页看。 还有些紧张,因为boss可能还等着解决问题呢。 想必这些情况,做web开发的同人也是经常遇到的。 下面要讲的是比较原理性的,我想如果对于乱码产生原因找到了,以后出现类似问题。按照原理推论,一定也会很快解决。 (以下说明文件,都是以文本文件说明)

 

一、文本文件编码是什么?

 

A、文本文件编码存在哪里了呢?

 

我们知道,计算机存储文件,最终都是以二进制保存的,通过流方式读取任何文件,得到是8位的字节流。一个文件生成了,同时也确定了它的编码了。 以下通过软件:winhex比较说明:

通过使用记事本:输入“中”,另存为时候,分别选择:utf-8,unicode,ansi编码。我们通过winhex打开比较下。

image

utf-8:EF BB BF E4 B8 AD 6字节

unicode:FF FE 2D 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、怎么样获得文件编码呢?

上个例子中,我们知道,文本文件编码不可能都保存在文件字节码中。 那么,应用程序读取文件怎么样判断编码呢?

image

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

我用windows 记事本打开:2个文件看一下:

image

怎么我文件内容是:”中“,用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 抓包图:

image

我们只抓取了:Stream这个选项卡,可以通过这里看到,右下返回内容是乱码,其实这些就是服务器返回字节流。 再往上看:image 这里有个:charset。 哈哈,它就是服务端返回给浏览器的一个编码。浏览器通过这个编码就能够知道用什么编码类解析该字节流了。 注意,返回charset编码,一定要与该文件流保存编码一致。否则一样乱码!

B、通过html源码,meta头告知

并不是所有服务器端程序都会,都是很么按章出牌,告知自己流编码。很多时候,php开发人员没有加入:

header("Content-type:text/xml;charset=字符编码"); 那么浏览器还有其它方法处理吗?

image

如果meta头指定了,浏览器也一样知道编码是什么了。

C、有一些问题:

如果header,meta两个个都指定了以那个为准呢?

测试表明,以http 协议中,response 头里面的charset为主。 会忽视掉,meta指定。

 

如果header,meta两个都没有指定,会出现什么情况呢?

这个时候,就像上面例子里面的记事本了。 会怎么出现依据浏览器自己本身设置默认编码。如果你文件刚好是:gb2312编写,查看浏览器默认编码刚好也是:gb2312,那么你的中文字符显示正 常。如果换上一个默认字符不一样,就会出现乱码情况。 这种情况,估计做web开发同人经常会遇到吧!

分享到:
评论

相关推荐

    PHP教学中的乱码问题及解决方法.pdf

    为此,本文从字符解码编码原理、Web 运行过程及 HTTP 响应报文格式等方面,深入分析了 Web 服务器和数据库服务器可能导致乱码的原因,并提出解决办法。 一、字符集与编码 字符是包括文字、数字、标点符号、图形...

    alert弹出框出现乱码

    在IT领域,尤其是在Web开发中,遇到“alert弹出框出现乱码”的问题并不罕见,这通常涉及到字符编码的问题。本文将深入解析该问题的原因、影响以及如何通过JavaScript和PHP来有效解决这一难题。 ### 一、问题背景 ...

    MYSQL字符集与乱码问题分析

    《MySQL字符集与乱码问题分析》一文深入探讨了字符编码的历史背景、技术细节以及在MySQL中的应用,尤其关注解决常见的乱码问题。本文将根据提供的内容摘要,详细阐述其中涉及的关键知识点。 ### 字符集背景知识 ##...

    WebShell文件上传漏洞分析溯源(第3题)

    本文将对 WebShell 文件上传漏洞进行深入分析,探讨其原理、危害性以及防御方法。同时,通过实践演示,展示如何绕过页面对可执行文件上传的限制,利用 WebShell 读取服务器上的源代码内容。 什么是 WebShell? ----...

    PHP实例开发源码-风吟PHP版BOM移除工具.zip

    BOM是一个特殊字符序列,用于标识文件的编码方式,但在某些情况下,它可能会导致乱码或者程序运行异常。针对这个问题,风吟PHP版BOM移除工具应运而生。 首先,我们需要理解什么是BOM。BOM是Unicode编码中的一个特性...

    PHP企业类网站实例开发源码——情感企业站程序4.2GBK版.zip

    本实例教程将深入探讨PHP在企业级网站开发中的应用,通过“情感企业站程序4.2GBK版”的源码分析,帮助读者掌握PHP网站实例开发的关键技术和实践技巧。 首先,我们要理解PHP的基础知识。PHP是一种服务器端的脚本语言...

    深入体验PHP项目开发pdf02

    然而,由于压缩包子文件的文件名称列表"深入体验PHP项目开发、╔ε╚δ╠σ╤ΘPHP╧ε─┐┐¬╖ó"看起来像是乱码或编码问题,无法准确理解其具体内容。正常情况下,这些文件名应该是章节名称或教程的部分内容,但...

    PHP相关学习帮助文档

    最后,"PHP手册"和"php手册-PHP5研究室编译 无乱码版本"是PHP官方文档的不同版本,为用户提供详尽的API参考。官方手册是学习和解决问题的必备资源,包含了所有内建函数、类、接口以及错误处理等方面的详细信息。 总...

    基于WEB的邮件接收

    下面我们将深入探讨这个主题,主要关注网络流、邮件内容读取以及字符乱码处理。 1. **网络流**: - 网络流是数据在网络中传输的一种抽象概念。在基于WEB的邮件接收中,邮件内容是通过HTTP或HTTPS协议以网络流的...

    基于PHP的CMSSP4utf-8正式版源码.zip

    对于想要深入理解PHP CMS工作原理、提高编程技能或创建个性化网站的人来说,这是一个宝贵的资源。 1. **PHP基础概念** PHP是一种服务器端的脚本语言,它嵌入HTML中,用于动态生成网页内容。PHP的优势在于其语法...

    PHP实例开发源码-php云购开源系统 UTF8.zip

    对于想要深入理解和开发PHP云购系统的用户,建议熟悉PHP语言基础,掌握MySQL数据库操作,了解前端技术如HTML、CSS和JavaScript,以及常见的Web开发框架如Laravel、Symfony等。同时,理解MVC架构原理,学习如何安全地...

    2017最新老男孩MySQL高级专业DBA实战课程全套【清晰不加密】,看完教程月入40万没毛病

    12-为什么选择MySQL数据库即MySQL优势介绍.avi 13-MySQL数据库分类与版本升级知识讲解.avi 14-MySQL数据库商业版与社区版区别.avi 15-MySQL数据库的发布版本知识讲解.avi 16-MySQL数据库发展的三条产品线介绍.avi 17...

    PHP实例开发源码-PHP人才系统源码 GBK.zip

    【PHP人才系统源码GBK.zip】...通过这个项目,你可以提升PHP编程技能,了解Web应用程序的开发流程,并为未来构建自己的PHP项目打下坚实基础。同时,也可以从中学习到软件工程实践,如代码组织、注释编写和错误处理等。

    PHP实例开发源码—Hostpanel 简体中文UTF8.zip

    这个源码包提供了简体中文的用户界面,使用 UTF8 编码,使得中文显示无乱码问题,更适合中国开发者和用户使用。通过分析其提供的文件,我们可以深入理解 PHP 开发中的关键知识点。 1. **PHP 开发基础**:Hostpanel ...

    PHP实例开发源码-迅捷php网络留言本 1.1 GBK.zip

    通过分析和学习这个实例,我们可以深入了解以下PHP开发的关键知识点: 1. **PHP基础语法**:PHP是一种服务器端脚本语言,用于嵌入HTML中执行。在这个项目中,我们会看到如何在PHP文件中定义变量、控制结构(如if/...

    教程资源php

    这个压缩包显然旨在帮助初学者或有一定基础的开发者提升PHP技能,通过实际案例深入理解PHP的原理和应用。 【描述】提到的"PHP程序设计"涵盖了PHP的基本语法、函数、类与对象、数据库交互、错误处理和异常控制等方面...

    自动注册机 php代码

    通过深入研究和分析这些PHP文件,开发者不仅可以学习到自动注册的基本原理,还能提升对PHP编程、Web交互和编码转换的理解。同时,这也提醒我们,在探索和使用这类工具时,一定要遵循合法和道德的界限。

    PHP实例开发源码—留言帖吧 utf-8.zip

    【PHP实例开发源码—留言帖吧 utf-8.zip】是一个包含了PHP编程语言实现的留言帖吧系统的源代码包。...通过学习和分析这个源码,开发者不仅可以了解PHP的基本用法,还可以深入理解Web应用程序的架构和设计原则。

    php练手小项目

    通过这些小项目,你可以深入理解PHP编程,锻炼实际开发能力,为以后的Web开发工作打下坚实基础。同时,项目的GBK编码问题也是一个很好的实践机会,让你了解不同字符集的处理和转换方法。在实践中不断提升,你将能够...

Global site tag (gtag.js) - Google Analytics