无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5721|回复: 62
打印 上一主题 下一主题

[原创] UTF8 二进制扩展(utf8 binary extension)

    [复制链接]
跳转到指定楼层
1#
发表于 2021-3-20 09:31:48 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
本帖最后由 不点 于 2021-3-24 18:36 编辑

由于不知道要发在哪里,所以就发在这里了;有鉴于 Linux 对 UTF8 的支持比较完善,而 Windows 的 cmd 命令行对 UTF8 的支持目前还没有,将来有没有,还不好说。【更正:Win10 的控制台支持 UTF8;XP 和 Win7 的控制台不支持 UTF8】

又由于是“摸着石头过河”,不知道要写多少个帖子,所以,先占位前 30 个楼层。

标题的含义,大家可以这么理解:《关于 UTF8 的思考》或《UTF8 的改进、完善、补充》

发帖的形式是“无定形”,想到哪,写到哪。就好比是“随笔”、“日记”、“博客”。

今天准备搜集一些基础资料,温习基本概念,作为铺垫。

好的,先搜到这个: https://www.crockford.com/utf8.html

全文照搬过来:


2019-06-24

UTF-8


UTF-8 is one of the smartest things I've seen. It is a byte stream encoding for simple values (like Unicode characters) that can be bigger than bytes. UTF-8 has some wonderful properties:

  • ASCII is a proper subset, so all ASCII encoded streams are also UTF-8 streams.
  • The first byte of a multi-byte character tells the number of bytes.
  • Continuation bytes are easily distinguished from first bytes.
  • The sort order is preserved, not that matters for Unicode.


A first byte can contain between 2 and 7 bits of data. A first byte also determines the number of continuation bytes. Each continuation byte carries 6 bits of data.
UTF-8 has one unfortunate disadvantage, that many 16-bit characters are encoded in 3 bytes. This disadvantage is more than offset by its advantages, and by having a single, simple encoding that can work in all languages and contexts. The benefits range from greater reliability to better security. That is why JSON recommends UTF-8. UTF-8 is the good stuff. Thank you, Ken Thompson.
In my own work, I use a formulation that works well with 32-bit characters.

BinaryHexThruRangeThruContinuation
Bytes
Total
Data Bits
0xxxxxxx007F
00
7F
0
7
10xxxxxx80BF
continuation
6
110xxxxxC0DF
80
7FF
1
11
1110xxxxE0EF
800
FFFF
2
16
11110xxxF0F7
1 0000
1F FFFF
3
21
111110xxF8FB
20 0000
3FF FFFF
4
26
111111xxFCFF
400 0000
FFFF FFFF
5
32


印象中,UTF8 只处理最低的 31 位,最高的那一位是留待以后扩展的,目前不处理。所以,上述表格的最后一行是不太准确的。准确的似乎应该是这样:

1111110xFCFD
400 0000
7FFF FFFF
5
31


不过,这个细节无关紧要,因为现实中很少需要用那么大的代码点。

字节序 —— Byte Order Mark

字节序是一个特殊的 Unicode 字符,它的码点是 U+FEFF,不是 U+FFFE。它的 UTF8 表示是 EF BB BF。有时候,我们需要死记硬背。怎么样才能记住它?需要有一些联想或技巧。我们试着把 U+FFFE 转为 UTF8 字节串:它的十六进制表示是 EF BF BE,它的二进制表示是 11101111 10111111 10111110。它是个偶数,因此末尾是 0。它比 U+FFFF 只小 1,所以,除了末尾是 0,其他位都是 1,全都撑满了(除非按照 UTF8 规范某位只能为 0)。总结一下有下面这些特征,可以帮助记忆:

1、BOM(U+FEFF)是个奇数,不是偶数。其末尾是 F 不是 E。
2、BOM(U+FEFF)距离 16 位最大值 U+FFFF 较远,因此,它不是 U+FFFE。
3、U+FFFE 是noncharacter(非字符),也就是没有对它进行定义,或者说,它不是个正常的字符。因此,BOM 不是它。
4、位于 U+FFF0 至 U+FFFF 之间的 16 个字符,属于“特殊字符”范围,而 BOM (U+FEFF)位于此范围之外,而且距离较远。
5、BOM(U+FEFF)中的两个字节是 8 位整数中最大的两个字节 FF 和 FE,不会是 EF,因此,不要误记为 U+FFEF 或 U+EFFF 之类的。
6、BOM(U+FEFF)只能是 U+FEFF 和 U+FFFE 两者之一,而 U+FFFE 距离最大值U+FFFF 太近,予以排除。
7、BOM(U+FEFF)距离 U+FF00 较近: FEFF = FF00 - 1。
8、BOM(U+FEFF)恰好位于末尾的 256 个字符之外,也就是说,紧贴着末尾的 256 个字符。(此处末尾是指 BMP 的末尾)。

零宽不断行空格——Zero Width No-Break Space

历史上,BOM 曾经是唯一一个“零宽不断行空格”,现在新增了一个零宽不断行字符 U+2060(其正式名称叫做 word joiner,单词贴合器),而 BOM 就主要用作“字节序标记符”了。

非字符—— Non-Characters

在 17 个平面(Planes)中,每个平面结尾的 2 个码点,都是 non-character。这样就有了 34 个非字符。而在基本多语言平面(BMP)中,又定义了 32 个 non-characters:U+FDD0 ~ U+FDEF
所以,总共有 66 个非字符。这 66 个非字符是程序员可以私自使用的字符,不能用于公共交换的目的。

拉丁 1 补充字符 —— Latin-1 Supplement

在 ASCII 之外的所有字符中,码点 U+0080 ~ U+00FF 显然最重要,它们在码值上位于传统单字节字符的范围(有时称为“扩展的 ASCII 字符”),但不幸的是在 UTF8 的表示中需要占用两个字节。

unicode
utf8
hex
binary
binary
hex
80
10000000
11000010 10000000
C2  80
81
10000001
11000010 10000001
C2  81
82
10000010
11000010 10000010
C2  82
83
10000011
11000010 10000011
C2  83
84
10000100
11000010 10000100
C2  84
85
10000101
11000010 10000101
C2  85
86
10000110
11000010 10000110
C2  86
87
10000111
11000010 10000111
C2  87
88
10001000
11000010 10001000
C2  88
89
10001001
11000010 10001001
C2  89
8A10001010
11000010 10001010
C2  8A
8B10001011
11000010 10001011
C2  8B
8C10001100
11000010 10001100
C2  8C
8D10001101
11000010 10001101
C2  8D
8E10001110
11000010 10001110
C2  8E
8F10001111
11000010 10001111
C2  8F
90
10010000
11000010 10010000
C2  90
91
10010001
11000010 10010001
C2  91
92
10010010
11000010 10010010
C2  92
93
10010011
11000010 10010011
C2  93
94
10010100
11000010 10010100
C2  94
95
10010101
11000010 10010101
C2  95
96
10010110
11000010 10010110
C2  96
97
10010111
11000010 10010111
C2  97
98
10011000
11000010 10011000
C2  98
99
10011001
11000010 10011001
C2  99
9A10011010
11000010 10011010
C2  9A
9B10011011
11000010 10011011
C2  9B
9C10011100
11000010 10011100
C2  9C
9D10011101
11000010 10011101
C2  9D
9E10011110
11000010 10011110
C2  9E
9F10011111
11000010 10011111
C2  9F
A010100000
11000010 10100000
C2  A0
A110100001
11000010 10100001
C2  A1
A210100010
11000010 10100010
C2  A2
A310100011
11000010 10100011
C2  A3
A410100100
11000010 10100100
C2  A4
A510100101
11000010 10100101
C2  A5
A610100110
11000010 10100110
C2  A6
A710100111
11000010 10100111
C2  A7
A810101000
11000010 10101000
C2  A8
A910101001
11000010 10101001
C2  A9
AA10101010
11000010 10101010
C2  AA
AB10101011
11000010 10101011
C2  AB
AC10101100
11000010 10101100
C2  AC
AD10101101
11000010 10101101
C2  AD
AE10101110
11000010 10101110
C2  AE
AF10101111
11000010 10101111
C2  AF
B010110000
11000010 10110000
C2  B0
B110110001
11000010 10110001
C2  B1
B210110010
11000010 10110010
C2  B2
B310110011
11000010 10110011
C2  B3
B410110100
11000010 10110100
C2  B4
B510110101
11000010 10110101
C2  B5
B610110110
11000010 10110110
C2  B6
B710110111
11000010 10110111
C2  B7
B810111000
11000010 10111000
C2  B8
B910111001
11000010 10111001
C2  B9
BA10111010
11000010 10111010
C2  BA
BB10111011
11000010 10111011
C2  BB
BC10111100
11000010 10111100
C2  BC
BD10111101
11000010 10111101
C2  BD
BE10111110
11000010 10111110
C2  BE
BF10111111
11000010 10111111
C2  BF
C011000000
11000011 10000000
C3  80
C111000001
11000011 10000001
C3  81
C211000010
11000011 10000010
C3  82
C311000011
11000011 10000011
C3  83
C411000100
11000011 10000100
C3  84
C511000101
11000011 10000101
C3  85
C611000110
11000011 10000110
C3  86
C711000111
11000011 10000111
C3  87
C811001000
11000011 10001000
C3  88
C911001001
11000011 10001001
C3  89
CA11001010
11000011 10001010
C3  8A
CB11001011
11000011 10001011
C3  8B
CC11001100
11000011 10001100
C3  8C
CD11001101
11000011 10001101
C3  8D
CE11001110
11000011 10001110
C3  8E
CF11001111
11000011 10001111
C3  8F
D011010000
11000011 10010000
C3  90
D111010001
11000011 10010001
C3  91
D211010010
11000011 10010010
C3  92
D311010011
11000011 10010011
C3  93
D411010100
11000011 10010100
C3  94
D511010101
11000011 10010101
C3  95
D611010110
11000011 10010110
C3  96
D711010111
11000011 10010111
C3  97
D811011000
11000011 10011000
C3  98
D911011001
11000011 10011001
C3  99
DA11011010
11000011 10011010
C3  9A
DB11011011
11000011 10011011
C3  9B
DC11011100
11000011 10011100
C3  9C
DD11011101
11000011 10011101
C3  9D
DE11011110
11000011 10011110
C3  9E
DF11011111
11000011 10011111
C3  9F
E011100000
11000011 10100000
C3  A0
E111100001
11000011 10100001
C3  A1
E211100010
11000011 10100010
C3  A2
E311100011
11000011 10100011
C3  A3
E411100100
11000011 10100100
C3  A4
E511100101
11000011 10100101
C3  A5
E611100110
11000011 10100110
C3  A6
E711100111
11000011 10100111
C3  A7
E811101000
11000011 10101000
C3  A8
E911101001
11000011 10101001
C3  A9
EA11101010
11000011 10101010
C3  AA
EB11101011
11000011 10101011
C3  AB
EC11101100
11000011 10101100
C3  AC
ED11101101
11000011 10101101
C3  AD
EE11101110
11000011 10101110
C3  AE
EF11101111
11000011 10101111
C3  AF
F011110000
11000011 10110000
C3  B0
F111110001
11000011 10110001
C3  B1
F211110010
11000011 10110010
C3  B2
F311110011
11000011 10110011
C3  B3
F411110100
11000011 10110100
C3  B4
F511110101
11000011 10110101
C3  B5
F611110110
11000011 10110110
C3  B6
F711110111
11000011 10110111
C3  B7
F811111000
11000011 10111000
C3  B8
F911111001
11000011 10111001
C3  B9
FA11111010
11000011 10111010
C3  BA
FB11111011
11000011 10111011
C3  BB
FC11111100
11000011 10111100
C3  BC
FD11111101
11000011 10111101
C3  BD
FE11111110
11000011 10111110
C3  BE
FF11111111
11000011 10111111
C3  BF

位于 U+0000~U+00FF 这个范围的字符,有时还称为 binary 字符。这大概是因为,在传统上文件被粗略地分为“文本文件” 和 “非文本文件”。文本文件很可能粗略地认为是只含 ASCII 字符的文件(实际上文本文件很可能也不应该包含 00 以及其他一些控制字符),而非文本文件,也就粗略地认为是含有任意字符的文件(传统上的字符,就是字节;当 8 位字符不够用的时候,才有了 16 位字符和 32 位字符;字节始终是 8 位),也就是二进制文件。JavaScript 有 binary string 的概念,意思是“由 U+0000~U+00FF 这个范围中的字符所组成的字符串”。


unicode 扩展了字符的范围,然而,传统上“字节”这个概念,在 unicode 里面却无法体现。传统上,文件是以字节为单位来表示的,一个文件,可以由单一字节构成。unicode 是 4 字节的,没法处理这种情况。UTF8 虽然能处理单字节,但是位于 0x80 ~ 0xFF 的单字节,却是非法的 UTF8 字节串,没法处理。JavaScript 必须引入 ArrayBuffer 之类的东西,才能处理传统的字节空间。科技进步了,怎么问题反而多了,处理方法也复杂了? 有没有一个办法,让 UTF8 能够直接处理任意的字节空间?



49#
发表于 2022-2-11 14:33:05 | 只看该作者
期待大师新帖
回复

使用道具 举报

48#
发表于 2021-7-24 19:13:31 | 只看该作者
继续来学习了
回复

使用道具 举报

47#
发表于 2021-7-24 11:06:47 | 只看该作者
gbk兼容不及utf8好
回复

使用道具 举报

46#
发表于 2021-7-22 19:47:43 | 只看该作者
谢谢分享
回复

使用道具 举报

45#
发表于 2021-4-12 14:16:54 | 只看该作者
支持楼主分享
回复

使用道具 举报

44#
发表于 2021-4-10 08:14:01 | 只看该作者
关键是各个软件都兼容。
回复

使用道具 举报

43#
发表于 2021-4-7 23:29:16 | 只看该作者
进来学习关注
回复

使用道具 举报

42#
发表于 2021-4-4 19:44:32 | 只看该作者
编码不统一造成乱码问题的确困扰,但是别的语言少乱码,乱码通常是中日韩三语言之间双字节出现多。
回复

使用道具 举报

41#
发表于 2021-3-28 23:30:11 | 只看该作者
兼容是个问题,很多时间乱码就是因为编码不一致。
回复

使用道具 举报

40#
发表于 2021-3-23 13:29:13 | 只看该作者
收藏下来慢慢看
回复

使用道具 举报

39#
发表于 2021-3-22 11:56:44 | 只看该作者
规范不统一的确不太好。
回复

使用道具 举报

38#
发表于 2021-3-21 00:07:44 | 只看该作者
全世界什么时候能统一一个编码。
我觉得UTF-8的事挺多的,比较烦人,有的地方需要带BOM,有的地方不能带BOM。

点评

UTF8 甚至具有某些“特性”,因使用场合的不同,可以看成“优点”或“缺点”:一个Unicode码点能够有多个UTF8表示。UTF8最多采用6字节,比4字节的unicode能够携带更多的信息,这一点有时是可以当作优点来利用的。  发表于 2021-3-21 07:45
刚才说“字符范围增大了”,是说 UTF8 在最窄时只用一个字节,表示的范围是 0-127。UTF16在最窄时使用2字节,表示的范围是 0-65535, 而 utf32 最窄使用4字节,表示的范围是 2^31 个字符。范围逐步增大了。  发表于 2021-3-21 00:46
Linux 的 csh/tcsh 似乎完全不适应BOM的存在。它会拒绝执行整个脚本。然而 csh/tcsh 是不重要的 shell, 很少有人使用。总之,BOM带来的问题不多,而且,随着时间的推移,问题会越来越少,适应的软件会越来越多。  发表于 2021-3-21 00:32
Linux 的 bash 脚本能够部分地适应BOM,只不过需要把第一行固定地当成会出错的行,而不要让第一行做事情,注意只用第二行以后的行来做事。当然了,linux 的 shell 脚本会把回车符当作非法字符,这是另一个话题。  发表于 2021-3-21 00:26
至于说BOM,还真不算个啥事。产生冲突的地方并不多。有许多软件能够适应BOM的存在。个别软件因BOM的存在而不能正常运行。  发表于 2021-3-21 00:20
回复

使用道具 举报

37#
发表于 2021-3-20 14:48:31 | 只看该作者
为什么要用"占楼"而不使用论坛程序自带的"推荐"功能呢???

点评

谢谢指导。其一,占楼操作简单粗暴,好用,懒得以后再使用推荐功能。其二,推荐功能有出毛病、不起作用的时候。论坛更换程序时,功能就可能出现紊乱。其三,占楼也是模仿前人的做法,我只是小小学习了一把而已。  发表于 2021-3-20 16:45
回复

使用道具 举报

36#
发表于 2021-3-20 14:01:51 | 只看该作者
不错,学习一下
回复

使用道具 举报

35#
发表于 2021-3-20 12:24:12 | 只看该作者
本帖最后由 slore 于 2021-3-20 12:28 编辑
这么说来,Linux 控制台支持 UTF8 还是要早一些,早在上世纪都支持了。微软只是最近几年才想着要支持而已。

微软推自家的Unicode,带BOM,Linux是起步就UTF8,不是技术上的问题。

CR,LF,CRLF换行符现在系统上一样的。统一不难,不愿意做而已。

UTF8,字有1字节,2字节,3字节,甚至多字节,变化就是省了存储空间而已。
Unicode固定2字节,想想C语言的结构体内存对齐,占空间也有处理上的好处。

各有个的设计目的。

上世纪支持也好,现在才支持也好,哪怕不支持也好,系统不是照样用?
XP, 7不支持还不是你们办公环境占据90% 。系统支持它并没有难度,而是支持它有啥改变么。
Win10支持了,你们不是不愿意升级。

Win10融合Linux,开源,子系统等功能,促进它对UTF-8支持,或者说顺便支持。



点评

顺便说点废话。前些年,有人找我安装 Win7,我拒绝,因为我自己不用Win7。后来,我用了win7,就逐渐远离XP。但是,如今还有人要XP,我总是劝其安装Win7,但是有一半的人拒绝安装Win7。没办法只好备一个XP给他们用。  发表于 2021-3-24 10:03
学习了,谢谢  发表于 2021-3-21 08:55
自己不用 Win10,惯性地认为微软在控制台依旧不支持 UTF8,仅此而已,不必引申太远、太深。当我想发帖时,首先就遇到这样一个问题:发在哪个讨论区?研究半天,没见到合适的去处,权衡之下,觉得发在Linux区还行。  发表于 2021-3-20 16:36
回复

使用道具 举报

34#
发表于 2021-3-20 11:31:24 | 只看该作者
另外,还有输入法支持,就不过高要求了。





不知道这是不是高要求,不过测试来看,可以自带输入法,第三方输入法输入的汉字,可以输出成UTF8格式。

点评

这么说来,Linux 控制台支持 UTF8 还是要早一些,早在上世纪都支持了。微软只是最近几年才想着要支持而已。  发表于 2021-3-20 12:06
嗯,非常感谢您能告知 Win10 的控制台已经全面支持 UTF8 了。不过,Win7 不支持,也算是个不小的毛病。虽然微软说Win7过时了,但 XP 和 Win7 在我们办公环境占据 90%,Win10 在强制安装的情况下,也只装在新电脑上。  发表于 2021-3-20 12:02
回复

使用道具 举报

33#
发表于 2021-3-20 11:28:04 | 只看该作者
Windows 目前 支持的系统Win10及同内核的版本/Windows 8.1 扩展支持到2023年。Windows XP, 7已经不再支持了。

7上好像只支持Unicode,不支持UTF-8。

回复你自然用的是 目前 支持 的 Windows 10 操作系统。


回复

使用道具 举报

32#
发表于 2021-3-20 10:42:57 | 只看该作者
而 Windows 的 cmd 命令行对 UTF8 的支持目前还没有,将来有没有,还不好说。



新建文本文档.bat (系统记事本自动保存为 UTF-8 编码)

  1. @echo off

  2. chcp 65001

  3. echo 测试UTF8编码字符串输出
  4. pause

  5. echo 测试显示UTF8文件内容
  6. type "%~0"

  7. pause
  8. goto :EOF

  9. >而 Windows 的 cmd 命令行对 UTF8 的支持目前还没有,将来有没有,还不好说。

  10. 一直都有支持的UTF8。
复制代码

点评

XP 下不工作。Win7 下我也曾经测试过,chcp 65001 是不工作的,无法处理 utf8 的字符输出。能告诉您所用的操作系统吗?您能给个图片来展示 cmd 下成功显示 utf8 汉字字符吗?另外,还有输入法支持,就不过高要求了。  发表于 2021-3-20 11:04
回复

使用道具 举报

31#
发表于 2021-3-20 10:02:03 | 只看该作者
还占吗?

点评

占位太多,抱歉啊。谢谢前来捧场。  发表于 2021-3-20 10:58
回复

使用道具 举报

30#
 楼主| 发表于 2021-3-20 09:44:12 | 只看该作者
30楼占位
回复

使用道具 举报

29#
 楼主| 发表于 2021-3-20 09:43:48 | 只看该作者
29楼占位
回复

使用道具 举报

28#
 楼主| 发表于 2021-3-20 09:43:22 | 只看该作者
28楼占位
回复

使用道具 举报

27#
 楼主| 发表于 2021-3-20 09:43:04 | 只看该作者
27楼占位
回复

使用道具 举报

26#
 楼主| 发表于 2021-3-20 09:42:41 | 只看该作者
26楼占位
回复

使用道具 举报

25#
 楼主| 发表于 2021-3-20 09:42:14 | 只看该作者
25楼占位
回复

使用道具 举报

24#
 楼主| 发表于 2021-3-20 09:41:53 | 只看该作者
24楼占位
回复

使用道具 举报

23#
 楼主| 发表于 2021-3-20 09:41:36 | 只看该作者
23楼占位
回复

使用道具 举报

22#
 楼主| 发表于 2021-3-20 09:41:15 | 只看该作者
22楼占位
回复

使用道具 举报

21#
 楼主| 发表于 2021-3-20 09:40:44 | 只看该作者
21楼占位
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2026-2-17 00:01

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表