「2014-2-26」Unicode vs. UTF-8 etc.
目测是个老问题了。随便一搜,网上各种总结过。这里不辞啰嗦,尽量简洁的备忘一下。
几个链接,有道云笔记链接,都是知乎上几个问题的摘录;阮一峰的日志,1-5 还是值得参考,但是之后的部分则混淆了 Windows Unicode 和更广泛意义上的 Unicode 的区别,前者最早是将 UCS-2 标准的编码称作 Unicode,win2k 之后则替换成了 UTF-16LE with BOM,但依然称作是 Unicode,terminology 层面的混淆极易坑人。
另外一个问题:为什么 UTF-8 不需要 BOM (byte order mark) 而 UTF-16 UTF-32 之类的需要?简而言之,前者是基于字节(byte oriented)的前缀匹配的解析规则,所以,顺着字节依次解析即可正确完成 UTF-8 encoding => number index => Unicode character 的解读;而无论是 UTF-16 还是 UTF-32 都存在「填充字节」的情况,所以依赖 byte order mark 来指定大小端。stackoverflow 一篇回答值得一读,另一个问题也不错。
In order to decide if a text uses UTF-16BE or UTF-16LE, the specification recommends to prepend a Byte Order Mark (BOM) to the string, representing the character U+FEFF. So, if the first two bytes of a UTF-16 encoded text file are FE, FF, the encoding is UTF-16BE. For FF, FE, it is UTF-16LE.
再附上一个问题链接:这篇回答讲述了为什么 Windows 会在 Unicode 的问题上引入如此易混淆的私有术语(整体归因于历史原因 & 微软不容动摇的向后兼容理念),并指出 ANSI 其实也和美国国家标准协会也没啥关系,实际上,字符编码里经常听闻的 ANSI 实际上是系统本地的编码格式,如简体中文的 ANSI 实则是 GBK 等等…… 这条回答则站在 ASCII 的角度,阐述了 Unicode 和 UTF-8 的区别,「UTF-8 is an encoding used to translate binary data into numbers. Unicode is a character set used to translate numbers into characters.」
最后,我们以「余」为例来讨论 Unicode 字符集和 UTF-8 编码。查询来源:Unicode 联合会的 code charts 的 Unihan 字符子集,可下载 pdf 或者通过在线数据库查询。

其 numerical index 编号是 20313 即 0x4f59(二进制形式:0100 1111 0101 1001),参考上文提到的日志,可知落在 3 个字节的编码范围里(也就是说,根据 UTF-8 的编码,需要 3 个 8 位的字节来表征),即「1110xxxx 10xxxxxx 10xxxxxx」,将上述 0x4f59 填入,便得到了「11100100 10111101 10011001」也就是 0xe4bd99。可通过在线查询的结果对比分析。
「2014-2-26」Unicode vs. UTF-8 etc.的更多相关文章
- Solution -「2020.12.26」 模拟赛
0x00 前言 一些吐槽. 考得很变态诶,看每道题平均两秒的时限就知道了... T1 降智了想到后缀懒得打. T2 口胡了假优化,结果和暴力分一样?? T3 黑题还绑点?? \(50 + 80 + 0 ...
- 叮,GitHub 到账 550 美元「GitHub 热点速览 v.22.26」
作者:HelloGitHub-小鱼干 如果你关注 GitHub 官方动态,你会发现它们最近频频点赞世界各地开发者晒出的 GitHub $550 sponsor 截图,有什么比"白嫖" ...
- 企业运营对 DevOps 的「傲慢与偏见」
摘要:出于各种原因,并非所有人都信任 DevOps .有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为 DevOps ...
- 「面向打野编程」iOS多线程:CGD
「面向打野编程」iOS多线程:CGD 前言 参考网络其他文章而写,渣水平,抛砖引玉. 虽然Concurrent意思为并发,但由于队列的实际效果,以下称为并行队列. 当前iPhone的CPU核心数远小于 ...
- FFmpeg + SDL2 实现的视频播放器「视音频同步」
文章转自:http://blog.csdn.net/i_scream_/article/details/52760033 日期:2016.10.8 作者:isshe github:github.com ...
- [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?
[译]聊聊C#中的泛型的使用(新手勿入) 写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...
- 「JOI 2017 Final」JOIOI 王国
「JOI 2017 Final」JOIOI 王国 题目描述 题目译自 JOI 2017 Final T3「 JOIOI 王国 / The Kingdom of JOIOI」 JOIOI 王国是一个 H ...
- [LOJ#2328]「清华集训 2017」避难所
[LOJ#2328]「清华集训 2017」避难所 试题描述 "B君啊,你当年的伙伴都不在北京了,为什么你还在北京呢?" "大概是因为出了一些事故吧,否则这道题就不叫避难所 ...
- [LOJ#515]「LibreOJ β Round #2」贪心只能过样例
[LOJ#515]「LibreOJ β Round #2」贪心只能过样例 试题描述 一共有 \(n\) 个数,第 \(i\) 个数 \(x_i\) 可以取 \([a_i , b_i]\) 中任意值. ...
随机推荐
- form表单reset表格并执行搜索
其中reset() 不需要定义 search():是你执行的搜索的函数 <html> <head> <title>sf</title></head ...
- java操作数据库
增加 public String addParent(Parent pp) { Connection conn=new ConntionUtil().openConnection(); Prepare ...
- Postgres SQL学习笔记
1.创建表,添加,查询 create table StuInfo ( StuId SERIAL primary key,-- 自动增长列 StuName ), Birthday Date, StuPh ...
- iOS常用库之Masonry
简单介绍 Masonry 源码地址:https://github.com/Masonry/Masonry Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简 ...
- ZooKeeper概述(转)
译自http://zookeeper.apache.org/doc/trunk/zookeeperOver.html ZooKeeper是一个用于分布式应用的开源分布式协调服务.它提供了简单的原语集合 ...
- yum安装出错
[root@lxh yum.repos.d]# yum install -y samba Loaded plugins: fastestmirror, refresh-packagekit, secu ...
- C#实现简单的委托异步调用
delegate void textAsy(); static void Main(string[] args) { textAsy t = texts; AsyncCallback callBack ...
- jquery each遍历节点使用
---恢复内容开始--- $("#aaa :input[type='text']").each(function(i){ alert(this.value); this.v ...
- 用js将从后台得到的时间戳(毫秒数)转换为想要的日期格式
得到后台从数据库中拿到的数据我们希望格式是 2016年10月25日 17时37分30秒 或者 2016/10/25 17:37:30 然而我们前台得到的却是一段数字(时间戳,毫秒数) 14773860 ...
- Send SqlParameter to Dapper
Question: I' using Dapper in my project. I have a list of SqlParameters and I want to send it to Dap ...