【学习笔记】计算机编码

0.概述

有一天,我突发奇想,想要在一段文本中筛选出所有的中文。

这一下把我难倒了——老师教的是 ASCIIASCII 码,包含了所有的拉丁字母、数字等。但是汉字是怎么存储的?

我懵了,赶紧上网一阵乱查,把自己都查晕了,写个文章捋一捋。所以这是一篇没用的垃圾文章

1.ASCIIASCII

ASCIIASCII 码在百度百科中被解释为“美国信息交换标准代码”,是一种编码的方式,也是最简单的一种编码。它的范围很小,只用了 [0,128)[0,128) 这些数字。

说明:下文将涉及一些 C++\text{C++} 内的玩意儿。不知道是不是所有编程语言的存储方式都相同?

如果你试着将 charcharintint 乱转换,你就会得到一张 ASCIIASCII 码表。这在百度百科中有。

众所周知,charchar 是一个字节,可以存储 [128,128)[-128,128) 内的整数。

2.UTF8UTF-8

只有拉丁字母怎么够?世界上那么多的语言,只靠 ASCIIASCII 码表示不了啊。

然后就有了更强力的编码方案,unicodeunicode 。显然来源于 uniqueunique 的意义。它 可以容纳世界上所有文字和符号!可以参见百度百科

介绍一个小技巧:在 wordword 中按 Alt+XAlt+X ,可以使光标前的字符转化成 unicodeunicode 码(十六进制)!再按一次,还能转换回来。提示:unicodeunicode 是四位十六进制数,共两字节。

然而,很显然,这玩意儿很长。全世界的字符那么多,如果每一个都按照 unicodeunicode 规定的码值来存储,就会很浪费空间。用二进制一看:一大堆零!

所以 unicodeunicode 只规定了一个对应法则,但是 存储时使用特定方案。其中一种,就是 UTF8UTF-8

它是 变长 的,使用一到六个字节。究竟怎么存?请看这篇文章

3.ANSIANSI

ANSIANSI 是啥呀?其实就是 本地语言。所以它并不固定,在中国(简体中文),ANSIANSI 代指 GBKGBKGB2312GB\bf{2312}

但是,任何一个国家的 ANSIANSI 都会使用两个字节来存储,除了纯英文使用 ASCIIASCII 码。

可以看这篇文章来加深印象。至于 GBKGBK 么?我马上要讲的啦!

4.GB2312GB\bf{2312}

这是什么?是中文的编码方案(终于进入正题了)。它使用两个字节来存储一个汉字。而且,很有特点的是,这两个字节范围为 [0x80,0xFF)[\text{0x80,0xFF}) 。为什么不使用 0xFF\text{0xFF} 这个编码呢?有待考究。

这个范围,使用 charchar 存储时,将会得到负数。所以,负数就是判断中文的方法!

5.GBKGBK

然而 GB2312GB\bf{2312} 没有收录所有汉字,所以又搞了个 GBKGBKANSIANSIwin95win95 以后就代表着这种编码方式。

更多的我就不讲了,同学们自己看看这篇文章也是极好的。

反正我还没碰到过需要使用 GB18030GB\bf 18030 相较于 GBKGBK 扩展的字符。

6.控制台语言

有时候程序输出到控制台(黑窗口,cmdcmd ) 的中文会变成乱码,但是改用文件输入输出,直接打开文件,结果又是正确的。为什么?

因为控制台的默认语言是 ANSIANSI 。这可以通过右键单击打开的 cmdcmd 窗口的边栏,选择属性,进行查看。

程序内的汉字常量(双引号内的汉字)的编码方式取决于 cppcpp 文件本身。txttxt 文件默认 ANSIANSI

7.总结

  • ASCIIASCII 是个超级小的字符编码,但是常用的符号,如空格、换行等,皆包含其内。并且,这是国际标准,所以其余的编码方案几乎都没有改动已有的 ASCIIASCII 对应方案。
  • UTF8UTF-8 是存储全世界通用编码 unicodeunicode 的方案。存储 ASCIIASCII 码包含的字符,只需要一个字节;存储汉字,需要三个字节。所以,UTF8UTF-8 可以存储中文。
  • GB2312,GBK,GB18030GB{\bf 2312},GBK,GB\bf 18030 都是汉字编码方式。与 UTF8UTF-8 是独立的。双字节,专门管中文,遇到日文就有点捉急了。
  • 判断中文的方法:对于 GBKGBK ,使用 c<0c<0 即可;对于 UTF8UTF-8 怎么办?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章