php中文转unicode 对Unicode的简单研究和了解 Version1.0

php中文转unicode 对Unicode的简单研究和了解 Version1.0

对的简单研究和了解

1.0

因为在写PHP的时候遇到过几次乱码问题,一次是使用Mysql查询语句的时候返回了一堆乱码,一次是使用fopen()函数时读取文件的时候乱码,或者使用fopen()时如果文件名是中文的话出现打不开的情况。

对于上面讲的几种情况,使用Mysql时只要定义了你的语句使用了什么编码、以什么编码来处理、返回的结果是什么编码,如果你设定的那些编码和你网页中使用的编码一致,那么就不会有乱码的情况。另外,因为记事本一般保存的是ANSI编码格式的文本,如果网页设定了使用UTF-8编码,那么在网页中打开一个文件当然是会出现乱码的。这时候就需要用到iconv()函数来对编码进行转换。

那么,什么是,什么是UTF-8呢?

我们平常讲的“编码”实际上是以UTF-16方式来使用的,之所以这样是因为UTF-16所使用的编码在-和里给每个字定义的名称是一致的,没有经过转换。实际上并不是编码,而是一个字符集。

先来看看一个编码表:

下面我们就一起来详细地了解:

一、的编码方式和实现方式:

包括“编码方式”和“实现方式”两部分。以下对于这两个概念的说明部分来自维基百科:

编码方式:的编码方式与ISO 10646的通用字符集( Set,UCS)概念相对应,目前实际应用的版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节。这样理论上一共最多可以表示216即65536个字符。基本满足各种语言的使用。实际上目前版本的尚未填充满这16位编码,保留了大量空间作为特殊使用或将来扩展。

上述16位字符构成基本多文种平面(Basic Plane,简称BMP)。最新(但未实际广泛使用)的版本定义了16个辅助平面,两者合起来至少需要占据21位的编码空间,比3字节略少。但事实上辅助平面字符仍然占用4字节编码空间,与UCS-4保持一致。未来版本会扩充到ISO 10646-1实现级别3,即涵盖UCS-4的所有字符。UCS-4是一个更大的尚未填充完全的31位字符集,加上恒为0的首位php中文转unicode,共需占据32位,即4字节。理论上最多能表示231个字符,完全可以涵盖一切语言所用的符号。

BMP字符的编码表示为U+hhhh,其中每个h 代表一个十六进制数位。与UCS-2编码完全相同。对应的4字节UCS-4编码后两个字节一致,前两个字节的所有位均为0。我们再返回去看看上面的编码表:“他”对应的编码为“U+4ED6”。

实现方式:的实现方式不同于编码方式。一个字符的编码是确定的。但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对编码的实现方式有所不同。的实现方式称为转换格式( ,简称为UTF)。

例如,如果一个仅包含基本7位ASCII字符的文件,如果每个字符都使用2字节的原编码传输,其第一字节的8位始终为0。这就造成了比较大的浪费。对于这种情况,可以使用UTF-8编码,这是一种变长编码,它将基本7位ASCII字符仍用7位编码表示,占用一个字节(首位补0)。而遇到与其他字符混合的情况,将按一定算法转换php中文转unicode,每个字符使用1-3个字节编码,并利用首位为0或1进行识别。这样对以7位ASCII字符为主的西文文档就大大节省了编码长度。类似的,对未来会出现的需要4个字节的辅助平面字符和其他UCS-4扩充字符,2字节编码的UTF-16也需要通过一定的算法进行转换。

再如,如果直接使用与编码一致(仅限于BMP字符)的UTF-16编码,由于每个字符占用了两个字节,在 (Mac)机和PC机上,对字节顺序的理解是不一致的。这时同一字节流可能会被解释为不同内容,如某字符为十六进制编码4E59,按两个字节拆分为4E和59,在Mac上读取时是从低字节开始,那么在Mac OS会认为此4E59编码为594Ephp中文转unicode,找到的字符为“奎”,而在上从高字节开始读取,则编码为U+4E59的字符为“乙”。就是说在下以UTF-16编码保存一个字符“乙”,在Mac OS里打开会显示成“奎”。此类情况说明UTF-16的编码顺序若不加以人为定义就可能发生混淆,于是在UTF-16编码实现方式中使用了大端序(Big-, 简写为UTF-16 BE)、小端序(-,简写为UTF-16 LE)的概念,以及可附加的字节顺序记号解决方案,目前在PC机上的系统和Linux系统对于UTF-16编码默认使用UTF-16 LE。

此外的实现方式还包括UTF-7、、CESU-8、SCSU、UTF-32等,这些实现方式有些仅在一定的国家和地区使用,有些则属于未来的规划方式。目前通用的实现方式是UTF-16小尾序(LE)、UTF-16大尾序(BE)和UTF-8。在微软公司 XP操作系统附带的记事本()中,“另存为”对话框可以选择的四种编码方式除去非编码的ANSI(对于英文系统即ASCII编码,中文系统则为或Big5编码) 外,其余三种为“”(对应UTF-16 LE)、“ big ”(对应UTF-16 BE)和“UTF-8”。

目前辅助平面的工作主要集中在第二和第三平面的中日韩统一表意文字中,因此包括GBK、、Big5等简体中文、繁体中文、日文、韩文以及越南喃字的各种编码与的协调性被重点关注。考虑到最终要涵盖所有的字符,从某种意义而言,这些编码方式也可视作的出现于其之前的既成事实的实现方式,如同ASCII及其扩展Latin-1一样,后两者的字符在16位编码空间中的编码第一字节各位全为0,第二字节编码与原编码完全一致。但上述东亚语言编码与编码的对应关系要复杂得多。

二、UTF-8和UTF-16显示汉字的实质

上面的编码表是大端序的编码,使用的是小端序开始读取的,如果要显示一个“他”字的话要怎么办呢?

既然大端序的编码是“U+4ED6”,把它们两个两个地拆开,倒过来,就成了小端序“U+D64E”。

打开编辑器,新建一个文档,以16进制编辑,输入D64E,以UTF-16(无BOM)方式保存文档,再退出16进制编辑模式:

这样“他”就在屏幕上显示出来了。

上面那个是以UTF-16方式来输出“他”的,那么如果要以UTF-8方式来输出“他”要怎么办呢?

UTF-8和UTF-16不一样,UTF-8在0-0x7F范围之内和ASCII码表是相一致的,就是说在显示英文字符和其它半角符号的时候UTF-8只占用了一个字节,UTF-16占用了两个字节,比如显示一个“A”,UTF-8是0x41,而UTF-16则是。UTF-8和之间存在着以下关系:

编码                         UTF-8字节流(二进制)

–          

–          

–           

–           

正如之前所说,它在0-范围内和ASCII码表是相一致的,只占一个字节。其它字符可能会占2-3个字节。而我们平常使用的汉字占了多少字节呢?

我们回去看之前的“他”——U+4ED6,在-范围之内,于是一个汉字占用的是三个字节。

我们把4ED6转换成二进制——100 ,将它们从低位开始向三个字节的模板进行填充,不足的在前面补0:

11

把它转换成16进制是0xE4 0xBB 0x96

新建一个文件,保存成UTF-8(无BOM)格式文件,以16进制方式编辑,输入E4 BB 96php中文转unicode 对Unicode的简单研究和了解 Version1.0,再退出16进制编辑方式:

同样“他”也被显示出来了。

UTF-16在使用的时候需要注意小端序和大端序的问题,而UTF-8则不用。

【补充】这里出现了几个新概念:

1、 :由“国际标准化组织(ISO)”制定的一个字符集,ISO和组织意识到世界上不应该出现两个不兼容的字符集php中文转unicode 对Unicode的简单研究和了解 Version1.0,双方就开始了协调工作,它们为每个字所编的编码都是一致的,但也有差别,详细请百度= =

2、 UCS:通用字符集( Set)。是由ISO制定的ISO 10646(或称ISO/IEC 10646)标准所定义的字符编码方式。UCS不仅给每个字符分配一个代码,而且赋予了一个正式的名字。表示一个UCS或值的十六进制数通常在前面加上“U+”,例如“U+0041”代表字符“A”。(注:百度百科里给它解释的是“字符集” Set,但经过我考证这个好像是ISO制定的东西。另外UCS分为UCS-2和UCS-4,UCS-2采用两个字节,UCS-4采用4个字节。目前采用的是UCS-2,UCS-4是在UCS-2的前面补了两个0,UCS-4目前尚未普及)

3、 BOM:形象点说就是一个文件的“头”。这个“头”可以告诉系统这个文件是UTF-8的,还是UTF-16的等等。

4、 ASCII:

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » php中文转unicode 对Unicode的简单研究和了解 Version1.0

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们