0.概述
有一天,我突发奇想,想要在一段文本中筛选出所有的中文。
这一下把我难倒了——老师教的是 A S C I I ASCII ASCII 码,包含了所有的拉丁字母、数字等。但是汉字是怎么存储的?
我懵了,赶紧上网一阵乱查,把自己都查晕了,写个文章捋一捋。所以这是一篇没用的垃圾文章。
1. A S C I I ASCII ASCII
A S C I I ASCII ASCII 码在百度百科中被解释为“美国信息交换标准代码”,是一种编码的方式,也是最简单的一种编码。它的范围很小,只用了 [ 0 , 128 ) [0,128) [0,128) 这些数字。
说明:下文将涉及一些 C++ \text{C++} C++ 内的玩意儿。不知道是不是所有编程语言的存储方式都相同?
如果你试着将 c h a r char char 和 i n t int int 乱转换,你就会得到一张 A S C I I ASCII ASCII 码表。这在百度百科中有。
众所周知, c h a r char char 是一个字节,可以存储 [ − 128 , 128 ) [-128,128) [−128,128) 内的整数。
2. U T F − 8 UTF-8 UTF−8
只有拉丁字母怎么够?世界上那么多的语言,只靠 A S C I I ASCII ASCII 码表示不了啊。
然后就有了更强力的编码方案, u n i c o d e unicode unicode 。显然来源于 u n i q u e unique unique 的意义。它 可以容纳世界上所有文字和符号!可以参见百度百科。
介绍一个小技巧:在 w o r d word word 中按 A l t + X Alt+X Alt+X ,可以使光标前的字符转化成 u n i c o d e unicode unicode 码(十六进制)!再按一次,还能转换回来。提示: u n i c o d e unicode unicode 是四位十六进制数,共两字节。
然而,很显然,这玩意儿很长。全世界的字符那么多,如果每一个都按照 u n i c o d e unicode unicode 规定的码值来存储,就会很浪费空间。用二进制一看:一大堆零!
所以 u n i c o d e unicode unicode 只规定了一个对应法则,但是 存储时使用特定方案。其中一种,就是 U T F − 8 UTF-8 UTF−8 。
它是 变长 的,使用一到六个字节。究竟怎么存?请看这篇文章。
3. A N S I ANSI ANSI
A N S I ANSI ANSI 是啥呀?其实就是 本地语言。所以它并不固定,在中国(简体中文), A N S I ANSI ANSI 代指 G B K GBK GBK 或 G B 2312 GB\bf{2312} GB2312。
但是,任何一个国家的 A N S I ANSI ANSI 都会使用两个字节来存储,除了纯英文使用 A S C I I ASCII ASCII 码。
可以看这篇文章来加深印象。至于 G B K GBK GBK 么?我马上要讲的啦!
4. G B 2312 GB\bf{2312} GB2312
这是什么?是中文的编码方案(终于进入正题了)。它使用两个字节来存储一个汉字。而且,很有特点的是,这两个字节范围为
[
0x80,0xFF
)
[\text{0x80,0xFF})
[0x80,0xFF) 。为什么不使用
0xFF
\text{0xFF}
0xFF 这个编码呢?有待考究。
这个范围,使用 c h a r char char 存储时,将会得到负数。所以,负数就是判断中文的方法!
5. G B K GBK GBK
然而 G B 2312 GB\bf{2312} GB2312 没有收录所有汉字,所以又搞了个 G B K GBK GBK , A N S I ANSI ANSI 在 w i n 95 win95 win95 以后就代表着这种编码方式。
更多的我就不讲了,同学们自己看看这篇文章也是极好的。
反正我还没碰到过需要使用 G B 18030 GB\bf 18030 GB18030 相较于 G B K GBK GBK 扩展的字符。
6.控制台语言
有时候程序输出到控制台(黑窗口, c m d cmd cmd ) 的中文会变成乱码,但是改用文件输入输出,直接打开文件,结果又是正确的。为什么?
因为控制台的默认语言是 A N S I ANSI ANSI 。这可以通过右键单击打开的 c m d cmd cmd 窗口的边栏,选择属性,进行查看。
程序内的汉字常量(双引号内的汉字)的编码方式取决于 c p p cpp cpp 文件本身。 t x t txt txt 文件默认 A N S I ANSI ANSI 。
7.总结
- A S C I I ASCII ASCII 是个超级小的字符编码,但是常用的符号,如空格、换行等,皆包含其内。并且,这是国际标准,所以其余的编码方案几乎都没有改动已有的 A S C I I ASCII ASCII 对应方案。
- U T F − 8 UTF-8 UTF−8 是存储全世界通用编码 u n i c o d e unicode unicode 的方案。存储 A S C I I ASCII ASCII 码包含的字符,只需要一个字节;存储汉字,需要三个字节。所以, U T F − 8 UTF-8 UTF−8 可以存储中文。
- G B 2312 , G B K , G B 18030 GB{\bf 2312},GBK,GB\bf 18030 GB2312,GBK,GB18030 都是汉字编码方式。与 U T F − 8 UTF-8 UTF−8 是独立的。双字节,专门管中文,遇到日文就有点捉急了。
- 判断中文的方法:对于 G B K GBK GBK ,使用 c < 0 c<0 c<0 即可;对于 U T F − 8 UTF-8 UTF−8 怎么办?