7136|5

57

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于utf-8 with BOM [复制链接]

本帖最后由 梭罗瓦尔登 于 2015-4-25 21:40 编辑

ASCII最多示256个字符,因此各国就制定了自己的标准比如GB2312,SHIFT-JS,这些使用2字节来表示除ASCII码以外字符,但是各国的标准不一样,为了统一编码,把全世界的所有字符添加到一个统一的标准下UNICODE诞生了。
但是同时引入了很多问题:
1、很多文件都是ascii编码,如果用unicode 太浪费。
2、没有标志位说明该几个字节来解析为一个符号。
     这时候拯救世界的utf出现了,utf是unicode的一种实现,只不过更聪明了。utf16是占用两字节,或者四字节,utf32是占用四字节。utf8是很聪明的一种表示方式。
1、对于单字节符号,字节第一位为0,后面7位表示字节编码。
2、对于n字节符号,第一字节的前n位都设为1,第n+1位为0,其余位位编码位置。



这样就很省空间了。
但是对于utf16和utf32来说,就有还有一个问题,就是endian(字节序大小端问题),6c 49究竟是该按6c 49识别呢还是该按49 6c来识别呢,由此又引入了BOM(byte order mark)我翻译就是字节序标志,这玩意在utf-16中是FE FF,utf-32中是00 00 FE FF,这些在unicode中都是不存在的字符,因此用来表示字节序,比如,小端模式FF FE 大端模式FE FF等utf32以此类推。
所以很明显utf8 不存在字节序的问题但为什么还有EF BB BF呢,所以这正是纠结的地方,有些程序比如php当成文本来解析不会忽略,所以php解析文本乱码错误的时候有可能是这个问题。


一下摘自wiki
Not using a BOM lets the text be backwards-compatible with software that is not Unicode-aware. Often, a file encoded in UTF-8 is compatible with software that expects ASCII as long as it does not include a BOM. Examples include: a text file that only uses ASCII characters, a programming language that permits non-ASCII characters in string literals or comments but not elsewhere (such at the start of a file), a Unix shell that looks for a shebang at the start of a script。

如果不用BOM头可以让文本后向兼容那些不识别Unicode编码的软件。通常,一个utf8编码的文件是兼容那些需要ASCII编码的软件的,但前提是它不含BOM。比如说:一个只用ASCII编码的文本文件、一种只允许在字符串中出现非ASCII但别的地方不允许(比如文件的开头)、UNIX的shell脚本在开头寻找#!(shebang daung!我也是醉了)。
PS( 因为如果utf8 带BOM  即EF BB BF shell解析器将在文本开头找不到#! 从而引发错误--我是这么理解的我也没试)。

为什么要加BOM呢?为什么要加BOM呢?
知乎上说得很好以下引自知乎---
其实说BOM是个坏习惯也不尽然。BOM也是Unicode标准的一部分,有它特定的适用范围。通常BOM是用来标示Unicode纯文本字节流的,用来提供一种方便的方法让文本处理程序识别读入的.txt文件是哪个Unicode编码(UTF-8,UTF-16BE,UTF-16LE)。Windows相对对BOM处理比较好,是因为Windows把Unicode识别代码集成进了API里,主要是CreateFile()。打开文本文件时它会自动识别并剔除BOM。Windows用这个有历史原因,因为它最初脱胎于多代码页的环境。而引入Unicode时Windows的设计者又希望能在用户不注意的情况下同时兼容Unicode和非Unicode(Multiple byte)文本文件,就只能借助这种小trick了。相比之下,Linux这样的系统在多locale的环境中浸染的时间比较短,再加上社区本身也有足够的动力轻装前进(吐槽:微软对兼容性的要求确实是到了非常偏执的地步,任何一点破坏兼容性的做法都不允许,以至于很多时候是自己绑住自己的双手),所以干脆一步到位进入UTF-8。
原文链接http://www.zhihu.com/question/20167122?sort=created

最近在弄php 所以才接触字符编码,从昨天看到今天,不足之处还行指出,共同进步,嘿嘿


百度百科.png (10.89 KB, 下载次数: 0)

百度百科.png
此帖出自编程基础论坛

最新回复

踩一下。。。  详情 回复 发表于 2015-4-26 08:41
点赞 关注
 

回复
举报

1560

帖子

24

TA的资源

五彩晶圆(初级)

沙发
 
啊,不错不错,又长知识了。
此帖出自编程基础论坛

点评

谢谢版主 讲的还不够清楚 我还要继续学习呢  详情 回复 发表于 2015-4-25 21:36
 
个人签名这孩子,成熟的象征,理智的典范。
 
 

回复

57

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
lonerzf 发表于 2015-4-25 17:32
啊,不错不错,又长知识了。

谢谢版主 讲的还不够清楚 我还要继续学习呢
此帖出自编程基础论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

4
 
踩一下。。。
此帖出自编程基础论坛

点评

谢谢!!!  详情 回复 发表于 2015-4-26 09:41
 
个人签名[ 不能预知未来的我起码现在很清楚我爱的人是你 ]
 
 

回复

57

帖子

0

TA的资源

一粒金砂(中级)

5
 

谢谢!!!
此帖出自编程基础论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(中级)

6
 
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表