ASCII、Unicode、UTF-8、UTF-8(without BOM)、UTF-16、UTF-32傻傻分不清

前言

Github上下载了一份代码打算学习,源工程是在linux上开发的,我在Windows上编译通过不了,很多莫名奇妙的错误,最后发现源代码文件是UTF-8(without BOM)编码的,Notepad++修改编码格式为UTF-8编译通过。

  1. 为什么Windows不认识UTF-8(without BOM)?
  2. 为什么Linux认识UTF-8(without BOM)和UTF-8?

ASCII

毕竟在电子系混过四年,这个词不陌生,用一个字节的低7位来表示128个英文字符(0xxxxxxx),可是地球上的文字又不是只有英文,光汉字就好几万个,所以每个国家和地区又做了一套符合自身情况的编码规范,比如简体中文编码标准GB2312,使用两个字节来表示一个汉字,可以表示65536个中文字符。但是如果每个国家都这么搞那不就乱套了嘛,于是Unicode就应运而生了。

Unicode

Unicode是个符号集,与ASCII类似,只不过容量要大得多,可以理解成一张表,为世界上的每一个字符指定了一个惟一的二进制代码,但是它并没有规定这个二进制代码如何存储,于是乎UTF-8、UTF-8(without bom)、UTF-16、UTF-32应运而生。

UTF

  • UTF(Unicode Transformation Format)意为把Unicode字符转换成某种格式,常见到的有:

  • UTF-8:使用1至4个字节为每个字符进行编码,节省空间。

  • UTF-16:使2或4个字节为每个字符编码,大多数汉字采用2个字节,少了生僻字使用4个字节,编码单元为2个字节,所以存在字节序的问题,即大端还是小端。(不常用)

  • UTF-32:使4个字节为每个字符编码,编码单元为4个字节,所以存在字节序的问题,即大端还是小端。(不常用)

UTF-8

UTF-8是Unicode的实现方式之一,最大特点就是根据符号自动变化字节长度,即可变长编码,编码方式如下图所示:

	Unicode符号范围				UTF-8编码
(十六进制) (二进制)
————————————————————————————————————————————————————————————
0000 0000 0000 007F | 0xxxxxxx
0000 0080 0000 07FF | 110xxxxx 10xxxxxx
0000 0800 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  • 对于单字节字符,第一位为0,后面7位位对应的Unicode码,显然UTF-8是兼容ASCII的,

  • 对于n(n > 1)字节字符,第一个字节的前n位都设为1,第 n+1位设为0,后面的n-1个字节前两位一律设为10,其余的字节(图上的x)即为Unicode码。

UTF-8(without BOM)

BOM(Byte Order Mark)字节顺序标记,即可以用来标记是大端还是小端。在Unicode里面定义了一个叫做

”ZERO WITH NO-BREAK SPACE“的不可见字符,对应的Unicode编码是FEFF,有BOM的文件即文件开头有”ZERO WITH NO-BREAK SPACE“不可见字符,反之则没有。若是大端编码,则文件开头是FEFF,小端则是FFFE。BOM是为了配合UTF-16和UTF-32使用,因为它们编码编码单元包含多个字节,涉及字节序的问题。

UTF-8以单字节为编码单元,不存在字节序的问题,但是可以使用BOM来表明所使用的编码方式,字符”ZERO WITH NO-BREAK SPACE“在UTF-8中的编码是EF BB BF,所以当解码文件时发现开头的单个字节是EF BB BF即说明是UTF-8编码,Windows就是使用BOM来标记文本的编码方式的。

怎样区分UTF-8、UTF-16和UTF-32

打开文本时根据BOM来区分当前文件的编码类型

BOM							编码类型
——————————————————————————————————————
EF BB BF UTF-8
FE FF UTF-16(大端)
FF FE UTF-16(小端)
00 00 FE FF UTF-32(大端)
FF FE 00 00 UTF-32(小端)

ASCII、Unicode、UTF-8、UTF-8(without BOM)、UTF-16、UTF-32傻傻分不清的更多相关文章

  1. 码表 ASCII Unicode GBK UTF-8

    2017-1-3 [ASCII]一个字节(7位,128个字符,2个16进制) 不包含中文 ASCII(American Standard Code for Information Interchang ...

  2. ASCII&UNICODE编码演化

    ASCII 上个世纪60年代,美国制定了基于拉丁字母的一套电脑编码系统,取名为ASCII.它主要用于显示现代英语和其他西欧语言,是现今最通用的单字节编码系统. ASCII码使用指定的7位或8位二进制数 ...

  3. 浅显总结ASCII Unicode UTF-8的区别

    如果觉得此地排版不好,欢迎访问我的博客 浅显总结ASCII Unicode UTF-8的区别 制作表单时,为了追求更好的用户交互体验,常常会有提示性的内容,比如提醒用户字符的限制.由于英文,中文字符的 ...

  4. 字符编码 ASCII,Unicode和UTF-8的关系

    转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143166410626 ...

  5. 字符编码 ASCII unicode UTF-8

    字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(b ...

  6. Ansi、GB2312、GBK、Unicode(utf8、16、32)

    关于ansi,一般默认为本地编码方式,中文应该是gb编码 他们之间的关系在这边文章里描写的很清楚:http://blog.csdn.net/ldanduo/article/details/820353 ...

  7. ASCII UNICODE UTF "口水文"

    最近接了一个单是需要把非 UTF-8 (No BOM)编码的文件转换成 UTF-8 (No BOM),若此文件是 UTF-8 但带有 BOM ,需要转换成不带 BOM 的.于是开启了一天的阅读.首先花 ...

  8. ASCII\UNICODE编码的区别

    前几天,Google给我Hotmail邮箱发了封确认信.我看不懂,不是因为我英文不行,而是"???? ????? ??? ????"的内容让我不知所措.有好多程序员处理不好编码问题 ...

  9. 【转】【编码】ANSI,ASCII,Unicode,UTF8之一

          不同的国家和地区制定了不同的标准,由此产生了 GB2312.GBK.GB18030.Big5.Shift_JIS 等各自的编码标准.这些使用多个字节来代表一个字符的各种汉字延伸编码方式,称 ...

随机推荐

  1. pytest文档50-命令行参数--durations统计用例运行时间

    前言 写完一个项目的自动化用例之后,发现有些用例运行较慢,影响整体的用例运行速度,于是领导说找出运行慢的那几个用例优化下. --durations 参数可以统计出每个用例运行的时间,对用例的时间做个排 ...

  2. 编程代码 | C++/C输出阳历万年历—精美日历制作

    前言:本文章向大家介绍如何用C语言代码实现万年历使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下.   void输出万年历(int年, int月, int日 ...

  3. js后台提交成功后 关闭当前页 并刷新父窗体

    后台提交成功后 关闭当前页 并刷新父窗体 this.ClientScript.RegisterStartupScript(this.GetType(), "message", &q ...

  4. 【转】time 模块详解(时间获取和转换)

    转自鱼C论坛--https://fishc.com.cn/forum.php?mod=viewthread&tid=51326&highlight=time time 模块 -- 时间 ...

  5. proto文件生成对应的js和ts文件

    安装protobuf 先要安装node.js,然后用npm安装protobuf npm install -g protobufjs 生成js文件 单个文件 pbjs -t static-module ...

  6. 抽空学学KVM(六)qemu-img命令使用

    通过KVM创建虚拟机,用到的命令不多,而且可以通过qemu-img -help查看到非常详细的解释,常用的主要有以下几种: 1.qemu-img info  查看磁盘信息     #info [-f ...

  7. 使用websocket连接(对接)asp.net core signalr

    使用通用websocket连接asp.net core signalr 一.背景介绍 signalr的功能很强大,可以为我们实现websocket服务端节省不少的时间.但是可能由于不同的环境,我们在对 ...

  8. pwn之栈缓冲区溢出漏洞(入门)

    题目ret2text 题目信息确认 使用file命令查看文件类型 root@CTF:/home/# file ret2text ret2text: ELF 32-bit LSB executable, ...

  9. Vue 路由切换时页面内容刷新页面并更新数据

    第二次进入页面,页面路由参数已经改变,但是页面内容不会刷新 <keep-alive>是Vue的内置组件,能在组件切换过程中将状态保留在内存中,防止重复渲染DOM <keep-aliv ...

  10. B. GameGame 解析(思維、博弈)

    Codeforce 1383 B. GameGame 解析(思維.博弈) 今天我們來看看CF1383B 題目連結 題目 兩個人在玩遊戲,有一個長度為\(n\)的數列\(a\),每次每個人選一個數字和目 ...