ASCII、Unicode、UTF-8、UTF-8(without BOM)傻傻分不清
文章推薦指數: 80 %
UTF-8以单字节为编码单元,不存在字节序的问题,但是可以使用BOM来表明所使用的编码方式,字符”ZERO WITH NO-BREAK SPACE“在UTF-8中的编码是EF BB ...
首发于改不完的bug无障碍写文章登录/注册前言Github上下载了一份代码打算学习,源工程是在linux上开发的,我在Windows上编译通过不了,很多莫名奇妙的错误,最后发现源代码文件是UTF-8(withoutBOM)编码的,Notepad++修改编码格式为UTF-8编译通过。
为什么Windows不认识UTF-8(withoutBOM)?为什么Linux认识UTF-8(withoutBOM)和UTF-8?ASCII毕竟在电子系混过四年,这个词不陌生,用一个字节的低7位来表示128个英文字符(0xxxxxxx),可是地球上的文字又不是只有英文,光汉字就好几万个,所以每个国家和地区又做了一套符合自身情况的编码规范,比如简体中文编码标准GB2312,使用两个字节来表示一个汉字,可以表示65536个中文字符。
但是如果每个国家都这么搞那不就乱套了嘛,于是Unicode就应运而生了。
UnicodeUnicode是个符号集,与ASCII类似,只不过容量要大得多,可以理解成一张表,为世界上的每一个字符指定了一个惟一的二进制代码,但是它并没有规定这个二进制代码如何存储,于是乎UTF-8、UTF-8(withoutbom)、UTF-16、UTF-32应运而生。
UTFUTF(UnicodeTransformationFormat)意为把Unicode字符转换成某种格式,常见到的有:UTF-8:使用1至4个字节为每个字符进行编码,节省空间。
UTF-16:使2或4个字节为每个字符编码,大多数汉字采用2个字节,少了生僻字使用4个字节,编码单元为2个字节,所以存在字节序的问题,即大端还是小端。
(不常用)UTF-32:使4个字节为每个字符编码,编码单元为4个字节,所以存在字节序的问题,即大端还是小端。
(不常用)UTF-8UTF-8是Unicode的实现方式之一,最大特点就是根据符号自动变化字节长度,即可变长编码,编码方式如下图所示:Unicode符号范围UTF-8编码
(十六进制)(二进制)
————————————————————————————————————————————————————————————
000000000000007F|0xxxxxxx
00000080000007FF|110xxxxx10xxxxxx
000008000000FFFF|1110xxxx10xxxxxx10xxxxxx
000100000010FFFF|11110xxx10xxxxxx10xxxxxx10xxxxxx对于单字节字符,第一位为0,后面7位位对应的Unicode码,显然UTF-8是兼容ASCII的,对于n(n>1)字节字符,第一个字节的前n位都设为1,第n+1位设为0,后面的n-1个字节前两位一律设为10,其余的字节(图上的x)即为Unicode码。
UTF-8(withoutBOM)BOM(ByteOrderMark)字节顺序标记,即可以用来标记是大端还是小端。
在Unicode里面定义了一个叫做”ZEROWITHNO-BREAKSPACE“的不可见字符,对应的Unicode编码是FEFF,有BOM的文件即文件开头有”ZEROWITHNO-BREAKSPACE“不可见字符,反之则没有。
若是大端编码,则文件开头是FEFF,小端则是FFFE。
BOM是为了配合UTF-16和UTF-32使用,因为它们编码编码单元包含多个字节,涉及字节序的问题。
UTF-8以单字节为编码单元,不存在字节序的问题,但是可以使用BOM来表明所使用的编码方式,字符”ZEROWITHNO-BREAKSPACE“在UTF-8中的编码是EFBBBF,所以当解码文件时发现开头的单个字节是EFBBBF即说明是UTF-8编码,Windows就是使用BOM来标记文本的编码方式的。
怎样区分UTF-8、UTF-16和UTF-32打开文本时根据BOM来区分当前文件的编码类型BOM编码类型
——————————————————————————————————————
EFBBBFUTF-8
FEFFUTF-16(大端)
FFFEUTF-16(小端)
0000FEFFUTF-32(大端)
FFFE0000UTF-32(小端)发布于2020-03-1221:51Unicode(统一码)UTF-8ASCII赞同5添加评论分享喜欢收藏申请转载文章被以下专栏收录改不完的bug
延伸文章資訊
- 1What's the difference between UTF-8 and UTF-8 with BOM?
- 2Saving file using UTF8 without BOM as default
It look's weird in unity engine. I know VS can change default save encoding. But why not just set...
- 3Byte order mark - Globalization - Microsoft Learn
- 4关于Encode in UTF-8 without BOM_绯浅yousa的博客
关于Encode in UTF-8 without BOM定义BOM(Byte Order Mark),字节顺序标记,出现在文本文件头部,Unicode编码标准中用于标识文件是采用哪种格式的 ...
- 5How to remove BOM from any text/XML file - IBM