关于字符编码的一些简单思考

  在上一篇提到的BOM头,实际上牵扯到文本的编码问题,BOM头是出现在windows下用文本编辑器编写文件后,按照UTF-8的格式下保存文件而我们在编辑php脚本的时候通常是用utf-8的格式保存脚本文件,在这种情况下,我们发现不了bom头的存在。可是如果我们将php的脚本文件按照gbk编码保存我们就能轻易发现bom头的存在,道理很简单

  我们先看utf-8的编码规则,utf-8采用的是动态编码,实际上是以字节为单位对unicode(通用码)做的再编码,对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。下图可以大致看出utf8的编码规则。

  从编码规则上,我们可以看出bom头0xEF 0xBB 0xBF 符合utf-8指向一个字符的编码规则,那么如果以gbk的编码规则来看bom头,我们再来看看,首先,我们看看gbk的编码规则:
  "GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间,剔除 xx7F 一条线。总计 23940 个码位,共收入 21886 个汉字和图形符号,其中汉字(包括部首和构件)21003 个,图形符号 883 个。"(来源百度百科);

  我们选择带有BOM头的字符串看一下 <?xml version ,通过xxd,我们查看十六进制的编码规则如下efbb bf3c 3f78 6d6c 2076 6572 7369 6f6e  根据utf8的编码,先看e表示"1110",表示这个字符占3个字节,efbb bf被解析掉,在看3,二进制是"0011",符合ascii码规则,可以查到3f对应字符"<",如此下去,按照utf-8的编码规则解析了文本。


 

 如果按照gbk的编码规则,该是如何解释呢?根据前面的规则,efbb符合gbk解码规则,对应汉语字符"锘",再接着看 bf,在gbk的首字节范围内,而3c明显不在gbk编码的尾字节范围,如此实际上无法解析出正确的编码。

但我们已经发现了,如果统一要求我们书写的代码按照gbk的编码方式存储,将无法出现BOM头。

二、php代码存储的编码方式和代码执行输出的编码的关系

  前段提到了代码的存储方式,就是以什么样的编码方式存储,像以utf-8,GBK,UTF-16等等方式,但是代码需要执行相关操作,例如读取和输出操作,这个地方涉及到几个问题是
  1、utf8编码存储的代码读取gbk编码的输入,会按照什么样的情况解码?
  2、utf8编码存储的代码输出字符串的时候,输出的字符串是什么样的编码?

  这两个问题,在实验中发现,如果php脚本是utf8编码存储,那么它输出字符串后,所输出的字符串会是utf8编码,如果php脚本是gbk的编码存储,所输出的字符串会是gbk字符串。这一点,会说明一个问题就是。如果再php脚本中输出一个xml,他和xml申明的encoding=utf8还是gbk没有关系。这个encoding只是告诉调用者按照什么样的编码格式去解码。所以在这个地方要注意脚本存储的编码格式在和xml的encoding不一致的时候,需要做转码的工作。

三、substr在php脚本用使用的问题

  substr在php中主要用来截取字符串,如果字符串是英文,一般情况下没有问题,可以数数字符的个数,但是如果是中文,则需要非常小心,首先要判断输入的字符是什么样的编码,如果是gbk编码。汉字都是两个字节,而如果是utf8编码,汉字在3到4个字节。所以判断输入的汉字时候,会非常麻烦,如果必须要判断,可以试试下面步骤
  1、先将输入字符转成gbk格式,
  2、从开始读取字符串,判断字节是否大于0x7F,如果大于0x7F,则读取两个字节,反正读取一个字节。

时间: 2024-10-12 04:47:39

关于字符编码的一些简单思考的相关文章

8、字符编码-Python(转)

一 了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数据丢失 因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到了硬盘上. 在这一点上,我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已. 2. python解释器执行py文件的原理 ,例如python test.py 第一阶段:python解释器启动,

python第三天基础之字符编码

一 了解字符编码的知识储备 1. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数据丢失 因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到了硬盘上. 在这一点上,我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已. 2. python解释器执行py文件的原理 ,例如python test.py 第一阶段:python解释器启动,

day10 字符编码和文件处理

一.字符编码: 一 了解字符编码的知识储备   1. 计算机基础知识(三幅图)       2. 文本编辑器存取文件的原理(nodepad++,pycharm,word) 打开编辑器就打开了启动了一个进程,是在内存中的,所以在编辑器编写的内容也都是存放与内存中的,断电后数据丢失 因而需要保存到硬盘上,点击保存按钮,就从内存中把数据刷到了硬盘上. 在这一点上,我们编写一个py文件(没有执行),跟编写其他文件没有任何区别,都只是在编写一堆字符而已.  3. python解释器执行py文件的原理 ,例

字符编码知识简介和iconv函数的简单使用

字符编码知识简介和iconv函数的简单使用 字符编码知识简介 我们知道,在计算机的世界其实只有0和1.期初计算机主要用于科学计算,而我们知道一个数,除了用我们常用对10进制表示,也可以用2进制表示,所以只有0和1就可以进行科学计算,但是为了便于计算,大神们还是向计算机中引入的编码,比如通常我们用补码表示一个负数.所以编码这个东西,是从一开始就伴随着计算机的.到现在,我们的生活已经完全离不开计算机了,计算机也不仅仅用于科学计算了,更多地应用系信息处理.那计算机怎样表示与我们生活息息相关的事物呢,一

字符编码简单介绍

1. ASCII码 ASCII (American Standard Code for Information Interchange, 美国标准信息交换代码),是基于拉丁字母的一套编码系统.主要用于显示现代英语和其它西欧语言.它是现今最通用的单字节编码系统. 单个字节能够表示256个不同的字符,只是 ASCII 仅仅使用了当中低于\x80(即最高位字节为0)的一半来表示全部的英文字符以及一些控制字符,因此 ASCII 码的实际取值范围为0x00到0x7f之间,一共128个字符. 2. 多字节字

列表/元组/字符串/字典/集合/文件/字符编码

1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 1 names = ['Alex',"Tenglan",'Eric'] 通过下标访问列表中的元素,下标从0开始计数 1 2 3 4 5 6 7 8 >>> names[0] 'Alex' >>> names[2] 'Eric' >>> names[-1] 'Eric' >>> names[-2] #

【转】关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)

转载地址:http://www.imkevinyang.com/2010/06/%E5%85%B3%E4%BA%8E%E5%AD%97%E7%AC%A6%E7%BC%96%E7%A0%81%EF%BC%8C%E4%BD%A0%E6%89%80%E9%9C%80%E8%A6%81%E7%9F%A5%E9%81%93%E7%9A%84.html 字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题.这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助. 还是得从ASC

关于字符编码,你所需要知道的(ASCII,Unicode,Utf-8,GB2312…)

字符编码的问题看似很小,经常被技术人员忽视,但是很容易导致一些莫名其妙的问题.这里总结了一下字符编码的一些普及性的知识,希望对大家有所帮助. 还是得从ASCII码说起 说到字符编码,不得不说ASCII码的简史.计算机一开始发明的时候是用来解决数字计算的问题,后来人们发现,计算机还可以做更多的事,例如文本处 理.但由于计算机只识“数”,因此人们必须告诉计算机哪个数字来代表哪个特定字符,例如65代表字母‘A’,66代表字母‘B’,以此类推.但是计算机之间字符-数字的对应关系必须得一致,否则就会造成同

深入Struts2的过滤器FilterDispatcher--中文乱码及字符编码过滤器

引用 前几天在论坛上看到一篇帖子,是关于Struts2.0中文乱码的,楼主采用的是spring的字符编码过滤器(CharacterEncodingFilter)统一编码为GBK,前台提交表单数据到Action,但是在Action中得到的中文全部是乱码,前台的页面编码都是GBK没有问题.这是为什么呢?下面我们就通过阅读FilterDispatcher和CharacterEncodingFilter这两个过滤器的源代码,了解其实现细节,最终得出为什么中文还是乱码! 测试环境及其前置知识 Struts