第二 字符与编码

   二进制能够表示数字,那能不能表示数字之外的各种文字,如英文、中文、俄语、法语等世界各个国家的文字?答案是肯定的,

不仅可以表示各种文字,还能表示各种符号、图形(包括表情包)等。其中就使用到一种古老而又充满活力的技术——编码(coding)技术

标准、规范、协议是计算机、互联网的基石

   计算机中的编码技术,简单而言就是建立数字与字符之间一一对应的关系。比如用数字0到9分别表示其本身,10表示A,11表示B,12表示C,  以此类推,就能解决所有字符的编码问题。很显然实际上存在无数种编码的方式。正所谓“无规矩不成方圆”,没有统一的编码规则是不行的。美国作为计算机的发明地,最先提出了一套编码方案——ASCII (American Standard Code for Information Interchange ,美国信息交换标准代码),即**ASCII码**,见下图。

   ASCII码是计算机历史上最著名的编码方案之一,它最初是美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准,后来它被国际标准化组织(International Organization for Standardization, ISO)定为国际标准,称为ISO 646标准。ASCII码的局限性也是显而易见的,它仅能表示的字符太少了,对于数以万计的中国汉字就显得十分无力了。为了解决汉字的编码问题,中国制定了 GB2312GBKGB18030等编码标准。

   

Unicode编码——计算机世界中的“书同文”

    秦始皇统一六国后,为了便于管理庞大的帝国,保证政令通畅,于是推行统一的文字和度量衡——“书同文,车同轨”不仅是秦始皇一项重要的历史贡献,也深刻影响和促成中国之后两千多年大一统的政治格局的形成。如今世界那么大,各国的文字、符号的数量是相当惊人的,并且随着社会的发展,新的字符不断涌现。字符的编码也需要与时俱进。Unicode(统一码,也叫万国码、单一码)应运而生,彻底解决全世界所有国家的文字、符号的编码问题。

   Unicode编码系统可分为编码方式和实现方式两个层次。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8UTF-16UTF-32 都是将数字转换到程序数据的编码方案。  在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32。UTF是“UCS Transformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。

访问如下网站查看所有Unicode符号。

Unicode – The World Standard for Text and Emoji

中文乱码

   中国程序员在职业生涯中,一定会遇到的一个问题就是中文乱码问题。操作系统、数据库、网络传输都有可能出现中文乱码问题,其本质就是使用了不恰当的编码对中文数据进行编码、解码。因此非常有必要了解各种场景下系统正在使用的编码方式。GB2312、GBK、两种编码基本解决中文常用字符的编码,但中文中还有大量生僻字(人名、地名、成语等),需要GB18030才能编码。因此需要视具体情况采用恰当的编码。

ISO-8859-1(Latin-1 )MySQL数据库默认编码,网络传输默认编码

 

Rust中默认使用的是UTF-8编码

 编码转换 iconv

龙行龘龘(dá dá)前程朤朤(lǎng lǎng)生活䲜䲜(yè yè)健康𣊫𣊫(liù liù)财运𨰻𨰻(bǎo bǎo)

# 查看文件编码
file -bi example.txt
# UTF-8转为GBK
iconv -f UTF-8 -t GBK 沁园春·雪.txt > snow.txt

iconv -c UTF-8 -t GBK 沁园春·雪.txt > snow.txt

# GBK转为UTF-8
iconv -f GBK -t UTF-8 abc.txt > abc_1.txt

# UTF-8转为GB18030
iconv -f UTF-8 -t GB18030 生僻字.txt > gb18030.txt

操作系统的编码

```shell

# Windows PowerShell

PS C:\Users\huang> chcp

活动代码页: 936

```

```

代码页       国家(地区)或语言

437          美国

708          阿拉伯文(ASMO 708)

720          阿拉伯文(DOS)

850          多语言(拉丁文 I)

852          中欧(DOS) - 斯拉夫语(拉丁文 II)

855          西里尔文(俄语)

857          土耳其语

860          葡萄牙语

861          冰岛语

862          希伯来文(DOS)

863          加拿大 - 法语

865          日耳曼语

866          俄语 - 西里尔文(DOS)

869          现代希腊语

874          泰文(Windows)

932          日文(Shift-JIS)

936          中国 - 简体中文(GB2312)

949          韩文

950          繁体中文(Big5)

1200         Unicode        

1201         Unicode (Big-Endian)

1250         中欧(Windows)

1251         西里尔文(Windows)

1252         西欧(Windows)

1253         希腊文(Windows)

1254         土耳其文(Windows)

1255         希伯来文(Windows)

1256         阿拉伯文(Windows)

1257         波罗的海文(Windows)

1258         越南文(Windows)

20866        西里尔文(KOI8-R)

21866        西里尔文(KOI8-U)

28592        中欧(ISO)

28593        拉丁文 3 (ISO)

28594        波罗的海文(ISO)

28595        西里尔文(ISO)

28596        阿拉伯文(ISO)

28597        希腊文(ISO)

28598        希伯来文(ISO-Visual)

38598        希伯来文(ISO-Logical)

50000        用户定义的

50001        自动选择

50220        日文(JIS)

50221        日文(JIS-允许一个字节的片假名)

50222        日文(JIS-允许一个字节的片假名 - SO/SI)

50225        韩文(ISO)

50932        日文(自动选择)

50949        韩文(自动选择)

51932        日文(EUC)

51949        韩文(EUC)

52936        简体中文(HZ)

65000        Unicode (UTF-7)

65001        Unicode (UTF-8)

```

Rust中的编码

Rust中的编码

Rust中默认使用的是UTF-8编码

let sparkle_heart_vec = vec![240, 159, 146, 150];


// We know these bytes are valid, so we'll use `unwrap()`.

let sparkle_heart = String::from_utf8(sparkle_heart_vec).unwrap();

assert_eq!("💖", sparkle_heart);


let bytes = sparkle_heart.into_bytes();


assert_eq!(bytes, [240, 159, 146, 150]);

//中文(Unicode编码)

println!("\u{65b0}\u{534e}\u{793e}\u{5feb}\u{8baf}\u{ff1a}\u{0033}\u{6708}\u{0032}\u{0036}\u{65e5}\u{ff0c}\u{4e2d}\u{56fd}\u{548c}\u{6d2a}\u{90fd}\u{62c9}\u{65af}\u{5efa}\u{4ea4}\u{3002}");

println!("\u{5b78}\u{7fd2}\u{5f37}\u{570b} 伟大复兴");

println!("{:X} {:X}",'华' as u32,'夏' as u32);

//表情

println!("Rust常见emoji(表情符号):\u{1F1E8}\u{1F1F3}🦀💖🚀😂\u{1F980}\u{1F602}");

println!("常见emoji(国旗):\u{1F1E8}\u{1F1F3} 🇨🇳 🇺🇸 🇷🇺");

//ASCII

println!("ASCII常见字符:\u{0020}\u{0040}\u{0021}\u{0041}");

//符号

println!("数学符号:∂∆∮\u{2211}\u{2200}\u{2208}\u{2209}\u{222b}");

MySQL数据库的编码

```sql

show variables like 'character%';

```

- mysql数据库utf8编码、utf8mb4

-- utf8mb4

update bakeries_db.user set wx_nickname = 'abc🚀🎵✨' where id = 5;


-- utf8mb3

-- Error Code: 1366. Incorrect string value: '\xF0\x9F\x9A\x80\xF0\x9F...' for column 'wx_nickname' at row 1

update uic.user set wx_nickname = 'abc🚀🎵✨' where id = 5;

其他

- \u0000与空字符为什么不相等?

- mysql数据库utf8编码、utf8mb4

汉字如何输入计算机?

如何将汉字输入计算机?这个问题曾经是困扰中国人的一大难题。汉字数量庞大,结构复杂,如何使用键盘有限的键位完成汉字的输入,是一个非常有挑战的问题。解决方法大致有两个方向:一种方向是以汉字笔画入手,对汉字进行编码;另一种方向是以汉字的读音入手,使用拼音对汉字进行编码;为此“五笔输入法”、“拼音输入法”等输入法应运而生。“五笔输入法”曾以输入速度快,准确率高,风靡一时;随着不断创新,拼音输入法速度越来越快,加上学习成本低,渐成主流,相反五笔输入法则逐渐没落。

拼音输入法渐成主流与五笔输入法逐渐没落,究其原因还是在创新方面;

五笔输入法的优点

五笔输入法将字根分布到25个键位上,最多使用4个键位就能输入一个字、词。

粗略计算共有25的4次方种(390625)组合,如果一种组合有5种候选结果,

那么五笔输入法的编码方式就能轻松输入近200万种词组。

事实上,五笔输入法很多编码没有使用到,这大大限制了快速输入。

相反拼音输入法通过智能联想功能大大加快了输入速度。

拼音输入法在智能联想功能

- 中文与英文有哪些差异?

中文常用字3500个左右,基于深厚的文化底蕴,拥有强大的造词能力;

中文也有比较显著的缺点:  

一、同音字太多,如果不结合上下文,哪怕是国人也很难区分;  

二、汉字结构十分复杂(特别是繁体字)。

这些都为中文输入计算机系统造成极大的困难。为了实现汉字输入计算机,我们的前辈进行了艰辛地探索。直到王永民的“五笔字型”输入法,汉字输入计算机的难题才真正得到解决,时至今日拼音输入法渐成主流。

英文字母虽然只有26个,但常用单词数量则多大3-4万,而英文单词总数则有上百万之巨,而且还在日益增长中。背单词成为很多人学习过程中的拦路虎。

附录

- 五笔输入法

- 拼音输入法

五笔字根


 

笔画五笔编码汉字五笔编码汉字五笔编码一级简码
ggllsamwgghg一地在要工
hhlljcufttfn上是中国同
丿ttllrumtlwgj和的有人我
yyllrdfityi主产不为这
nnllrryyifcy民了发以经

词库 (流行词、成语、诗词等)

拥有庞大的词库是一个充满矛盾的事情,词库大意味着重码率高,也一定程度影响输入速度。

```txt

中华人民共和国

长征

朱雀

遥遥领先

龙芯

猎鹰

缅甸

加沙

以色列

巴基斯坦

哈马斯

胯下之辱

一饭千金

解衣推食

战无不胜

国士无双

十面埋伏

背水一战

拔旗易帜

置之死地而后生

明修栈道暗度陈仓

兵仙神帅

居常鞅鞅

功高震主

金石之交

独当一面

略不世出

不赏之功

匹夫之勇

妇人之仁

推陈出新

勋冠三杰

伐功矜能

伪游云梦

肝胆照人

钟室之祸

成也萧何败也萧何

问路斩樵

传檄而定

多多益善

鸟尽弓藏

气吞山河

乡利倍义

愚者千虑,必有一得;智者千虑,必有一失;

落后就要挨打

虚心使人进步,骄傲使人落后

小不忍则乱大谋

数风流人物,还看今朝。

吴忺蓥(wú xiān yíng)

牂牁(zāng kē)江大桥

```

五笔拆字原则

- 书写顺序

- 取大优先

- 能连不交

- 能散不连

  • 44
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值