admin管理员组文章数量:1660446
二进制能够表示数字,那能不能表示数字之外的各种文字,如英文、中文、俄语、法语等世界各个国家的文字?答案是肯定的,
不仅可以表示各种文字,还能表示各种符号、图形(包括表情包)等。其中就使用到一种古老而又充满活力的技术——编码(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码的局限性也是显而易见的,它仅能表示的字符太少了,对于数以万计的中国汉字就显得十分无力了。为了解决汉字的编码问题,中国制定了 GB2312、GBK、GB18030等编码标准。
Unicode编码——计算机世界中的“书同文”
秦始皇统一六国后,为了便于管理庞大的帝国,保证政令通畅,于是推行统一的文字和度量衡——“书同文,车同轨”不仅是秦始皇一项重要的历史贡献,也深刻影响和促成中国之后两千多年大一统的政治格局的形成。如今世界那么大,各国的文字、符号的数量是相当惊人的,并且随着社会的发展,新的字符不断涌现。字符的编码也需要与时俱进。Unicode(统一码,也叫万国码、单一码)应运而生,彻底解决全世界所有国家的文字、符号的编码问题。
Unicode编码系统可分为编码方式和实现方式两个层次。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。UTF-8 、UTF-16、UTF-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万,而英文单词总数则有上百万之巨,而且还在日益增长中。背单词成为很多人学习过程中的拦路虎。
附录
- 五笔输入法
- 拼音输入法
五笔字根
笔画 | 五笔编码 | 汉字 | 五笔编码 | 汉字 | 五笔编码 | 一级简码 |
---|---|---|---|---|---|---|
一 | ggll | 横 | samw | 五 | gghg | 一地在要工 |
丨 | hhll | 竖 | jcuf | 笔 | ttfn | 上是中国同 |
丿 | ttll | 撇 | rumt | 输 | lwgj | 和的有人我 |
乀 | yyll | 捺 | rdfi | 入 | tyi | 主产不为这 |
乙 | nnll | 拆 | rryy | 法 | ifcy | 民了发以经 |
词库 (流行词、成语、诗词等)
拥有庞大的词库是一个充满矛盾的事情,词库大意味着重码率高,也一定程度影响输入速度。
```txt
中华人民共和国
长征
朱雀
遥遥领先
龙芯
猎鹰
缅甸
加沙
以色列
巴基斯坦
哈马斯
胯下之辱
一饭千金
解衣推食
战无不胜
国士无双
十面埋伏
背水一战
拔旗易帜
置之死地而后生
明修栈道暗度陈仓
兵仙神帅
居常鞅鞅
功高震主
金石之交
独当一面
略不世出
不赏之功
匹夫之勇
妇人之仁
推陈出新
勋冠三杰
伐功矜能
伪游云梦
肝胆照人
钟室之祸
成也萧何败也萧何
问路斩樵
传檄而定
多多益善
鸟尽弓藏
气吞山河
乡利倍义
愚者千虑,必有一得;智者千虑,必有一失;
落后就要挨打
虚心使人进步,骄傲使人落后
小不忍则乱大谋
数风流人物,还看今朝。
吴忺蓥(wú xiān yíng)
牂牁(zāng kē)江大桥
```
五笔拆字原则
- 书写顺序
- 取大优先
- 能连不交
- 能散不连
本文标签: 字符
版权声明:本文标题:第二 字符与编码 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1729870010a1215781.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论