【学习笔记】计算机编码

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 UTF8

只有拉丁字母怎么够?世界上那么多的语言,只靠 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 UTF8

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

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 UTF8 是存储全世界通用编码 u n i c o d e unicode unicode 的方案。存储 A S C I I ASCII ASCII 码包含的字符,只需要一个字节;存储汉字,需要三个字节。所以, U T F − 8 UTF-8 UTF8 可以存储中文。
  • 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 UTF8 是独立的。双字节,专门管中文,遇到日文就有点捉急了。
  • 判断中文的方法:对于 G B K GBK GBK ,使用 c < 0 c<0 c<0 即可;对于 U T F − 8 UTF-8 UTF8 怎么办?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值