阿拉伯语 ascii乱码_彻底摆脱乱码的困惑

这世上为什么要有乱码这个东西...

先给大家出个思考题吧,一个汉字占多少字节?是不是网上搜出的答案五花八门,那么读完本篇文章,我希望你至少可以准确知道这个问题的答案,我觉得就算是收获。

  1. 什么是编码
  2. 字符集与字符编码
  3. 字符编码的起源 ASCII
  4. 字符编码开始初步发展(欧洲等国)
  5. 字符编码继续发展(来中国了!)
  6. 字符编码终极发展(遍布全世界了)
  7. 字符编码的总结
  8. 为什么会产生乱码
  9. 如何解决乱码
  10. 附录 ASCII、ISO-8859-1 码表
  11. 文末小惊喜

计算机是用 0 和 1 这种二进制形式,来表示一切信息的。所以它需要对所有的信息进行编码,对整数、浮点数进行编码,对字符串进行编码,对声音、图片、视频进行编码。每一种编码都可以深入研究来品味,比如人们发明出补码来使计算机的减法变成加法,还有各种将声音、图片等看似不可能的媒体信息编码成 0 和 1。一切都很美妙,唯独字符编码很讨人厌,往往程序员们都不愿意碰,因为它实在是太乱了。

那今天就由我来帮你理一理。

一、什么是编码

这个问题很重要

编码是把数据从一种形式转换为另外一种形式的过程,而解码则是编码的你过程。

注意,这里可没有说计算机哟,所以编码是一个更大的概念,比如我们每个人都有名字,那你的名字就是你这个人的一种编码。你还有身份证号,那你的身份证号又是你的一种编码。别小看这个简单的例子,它能解释你经常混淆的两个概念。

二、字符集与字符编码

字符集是一个系统支持的所有抽象字符的集合,它是各种文字和符号的总称,比如 ASCII 字符集、GBK 字符集,这就好比刚刚说的所有人这个集合。

字符编码则是怎么把字符集里的这些字符一一用二进制表示的一个字典,或者说一个函数,比如 ASCll 字符编码、GBK 字符编码,这就好比刚刚说的名字表示法身份证号表示法

咦?ASCII 字符集对应的编码方式是 ASCII 字符编码,GBK 字符集对应的编码方式是 GBK 字符编码?没错,通常来说,字符集同时定义了一套同名的字符编码规则。有人就有疑问了,那人这个字符集,不是可以用名字和身份证号两种字符编码么?是的,字符也可以,比如 Unicode 字符集,就可以用 UTF-8、UTF-16 等多种字符编码来表示。

还需要注意的一点是,在计算机的世界里,不会有像名字表示法这样,一个名字可能对应好多人的情况,所以名字表示法在字符编码这里,就不是一个好的字符编码方式,自然也不会有人广泛采用了。

三、字符编码的起源 ASCII

世界上第一份字符集和编码标准,显然是由美国人起草的,就是大名鼎鼎的 ASCII,一共包含了 128 个字符以及对应的二进制,比如小写字母 a 对应 01100001。这 128 个字符包括了可显示的 26 个字母(大小写)、10 个数字、标点符号以及特殊的控制符,也就是英语与西欧语言中常见的字符,这 128 个字符用一个字节(可表示 256 个字符)来表示绰绰有余,所以当时只用了 7 位,还留了一个最高位当做奇偶校验。不奇怪,英语国家的人觉得这真的足够了,假如世界上所有人都用英语,那字符编码真的超级简洁,也就不会有什么乱码问题和这篇文章了。

每一种字符编码最好的描述方式就是简单粗暴的一个字典,或者说一张表,比如 ASCII,没什么可解释的,它就是一张表。编码就从右往左看,解码就从左往右看。详见附录 ASCII。

四、字符编码开始初步发展(欧洲)

EASCII:扩展的 ASCII

我们说 ASCII 发生于美国,因为一开始只有美国有计算机,所以 ASCII 足够了。可是随着计算机的普及,西欧等国家首先开始使用(注意这时候还没有中国)。西欧语言的字符虽然没有中文这么多,但有很多字符是 ASCII 表示不了的。于是他们就把 ASCII 扩充变成了 EASCII,这扩充的包括希腊字母、特殊的拉丁符号等。由于 ASCII 只占了 7 位,所以 EASCII 把第 8 位利用起来,仍然是一个字节来表示,这时表示的字符个数是 256。

但 EASCII 并没有成功,西欧国家以及各个 PC 厂商各自定义出了好多不同的编码字符集,这时候你自然就能想到,一定有一个组织站出来统一这个混乱的局面,制定一个标准,这个组织就是国际标准化组织 ISO国际电工委员会 IEC

ISO-8859

这两个组织制定了一系列的 8 位字符集标准,叫做 ISO-8859。请注意,这叫一系列,我们常说的 ISO-8859-1 才是一个字符集标准,只是 ISO-8859 系列中的一个。之所以定一个系列,因为那时候还想着用单字节来编码,但除去 ASCII 占有的 0x00~0x7F,就只剩下 0x80~0xFF 可以使用了,比如将ISO-8859-1,就是向下兼容 ASCII 的字符集标准,其编码范围是 0x00~0xFF,0x00~0x7F 之间完全和 ASCII 一致,0x80~0x9F 之间是控制字符,0xA0~0xFF 之间是文字符号。

各个国家的符号都容纳进来显然是不够的,于是就分成了好多个版本,你是哪个国家的就用哪个。我们之所以经常提到 ISO-8859-1,是因为它适用于西欧国家,而英国就是西欧国家。

以下是全部的 ISO-8859 系列

标准名称 别名 适用范围
ISO/IEC 8859-1 Latin-1 西欧语言
ISO/IEC 8859-2 Latin-2 中欧语言
ISO/IEC 8859-3 Latin-3 南欧语言。世界语也可用此字符集显示。
ISO/IEC 8859-4 Latin-4 北欧语言
ISO/IEC 8859-5 Cyrillic 斯拉夫语言
ISO/IEC 8859-6 Arabic 阿拉伯语
ISO/IEC 8859-7 Greek 希腊语
ISO/IEC 8859-8 Hebrew 希伯来语(视觉顺序)
ISO/IEC 8859-8-I Hebrew-I 希伯来语(逻辑顺序)
ISO/IEC 8859-9 Latin-5 或 Turkish 它把 Latin-1 的冰岛语字母换走,加入土耳其语字母
ISO/IEC 8859-10 Latin-6 或 Nordic 北日耳曼语支,用来代替 Latin-4
ISO/IEC 8859-11 Thai 泰语,从泰国的 TIS620 标准字集演化而来。
ISO/IEC 8859-13 Latin-7 或 Baltic Rim 波罗的语族
ISO/IEC 8859-14 Latin-8 或 Celtic 凯尔特语族
ISO/IEC 8859-15 Latin-9 西欧语言,加入 Latin-1 欠缺的芬兰语字母和大写法语重音字母,以及欧元(€)符号。
ISO/IEC 8859-16 Latin-10 东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。

我们看到,ISO-8859-1 又叫做 Latin-1,所以现在你应该知道,有的地方比如 MySQL 里的字符集显示 Latin-1,不要陌生,他只是 ISO-8859-1 的别名。

还是那句话,字符编码就是一个字典或者对照表,说什么都不如列个表实在,ISO-8859-1 的对照表(只列出扩展了 ASCII 的部分)详见附录 ISO-8859-1

五、字符编码继续发展(来中国了)

GB2312

计算机开水普及到了中国,于是一切就不一样了。原本用一个字节就解决所有的符号编码,在中国是行不通的。于是 1981 年国家标准化管理委员会定了一套字符集叫 GB2312,每个汉字符号由两个字节组成,注意!这里变成了两个字节。理论上它可以表示 65536 个字符,不过它只收录了 7445 个字符,6763 个汉字和 682 个其他字符,同时它能够兼容 ASCII。

GBK

GB2312 所收录的汉字已经覆盖中国大陆 99.75% 的使用频率,但是对一些罕见的字和繁体字还有很多少数民族使用的字符都没法处理,于是后来就在 GB2312 的基础上创建了一种叫 GBK 的字符编码,GBK 不仅收录了 27484 个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。GBK 是利用了 GB2312 中未被使用的编码空间上进行扩充,所以它能完全兼容 GB2312 和 ASCII。

BIG5

台湾地区繁体中文标准字符集,采用双字节编码,共收录 13053 个中文字,1984 年实施。

GB18030 编码

2000 年 3 月 17 日发布的汉字编码国家标准,是对 GBK 编码的扩充,覆盖中文、日文、朝鲜语和中国少数民族文字,其中收录 27484 个汉字。GB18030 字符集采用单字节、双字节和四字节三种方式对字符编码。兼容 GBK 和 GB2312 字符集。

中文字符集总结

简单总结下上面的就是,ASCII < GB2312 < GBK < GB18030,后者是前者的扩充,也即兼容了前者。然后 BIG5 是台湾字符集,单独的一套。

61c7e513f080368fce0b1d68af3ca9d9.png
中文字符集图示

这里拿最常用的 GBK 编码举例,GBK 的中文编码是双字节来表示的,英文编码是用 ASCII 码表示的,既用单字节表示。但 GBK 编码表中也有英文字符的双字节表示形式,所以英文字母可以有 2 种 GBK 表示方式。为区分中文,将其最高位都定成 1。英文单字节最高位都为 0。当用 GBK 解码时,若高字节最高位为 0,则用 ASCII 码表解码;若高字节最高位为 1,则用 GBK 编码表解码。你可以看到上图中第一个字节在 00~7F(二进制 00000000~01111111,所以第一位是 0) 之间的都是 ASCII。

理论上说,中文字符编码也应该列一个对照表,无奈它实在是太多了,不但汉字数量多,而且编码方式也多。所以这里只列一下数量最少的 GB2312 ,而且用链接的形式给你。

GB2312 简体中文编码表

六、字符编码终极发展(遍布全球)

Unicode

跟 ISO-8859 的出现原因一样,只不过这次范围扩大到了全世界。当然世界各国都有自己国家的字符编码发展历史,这里就没必要一一展开了。1991 年,国际标准化组织和统一码联盟组织退出了 Unicode 项目,目的就是同一全世界的所有字符。

你可能知道 Unicode 分 UTF-8、UTF-16、UCS-2 等,而 ISO-8859 也分 ISO-8859-1、ISO-8859-2……你会不会觉得它们是一样的道理呢?错!

  • ISO-8859 是一个字符集的系列,分成 ISO-8859-1、ISO-8859-2 等好多字符集,而每个字符集对应的编码方式就是 ISO-8859-1 编码、ISO-8859-2 编码,是一对一的关系。
  • Unicode 本身就是一个字符集,是全世界所有字符的合集,它并不是字符集系列。而 Unicode 这个字符集特殊的地方在于,他的编码方式不叫 Unicode 编码,它的编码方式有很多种,分别是 UTF-8 编码、UTF-16 编码等。

所以字符集系列和字符集的区别,最好的例子就是 ISO-8859;而字符集和字符编码的区别,最好的例子就是 Unicode。

捋清了这个关系,下面我们就可以详细说说大家心心念念的 Unicode 了。Unicode 本身并没有规定一个字符究竟是怎么编码,甚至都没有规定用几个字节表示,所以也叫可变长度字符编码。Unicode 只规定了每个字符对应到唯一的代码值(code point),代码值从 0000~10FFFF 共 1114112 个值,你曾经看到的很讨人厌的 \u0300 这种,就是 Unicode 的代码值,这种代码值要想变成真正存储在机器里的字符串

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据来源:中经数据库 主要指标110多个(全部都是纯粹的 市辖区 指标),大致是: GDP GDP增速 第一产业增加值占GDP比重 第二产业增加值占GDP比重 第三产业增加值占GDP比重 人均GDP 社会消费品零售总额 固定资产投资(不含农户) 新设外商投资企业数_外商直接投资 实际利用外资金额(美元) 一般公共预算收入 一般公共预算支出 一般公共预算支出_教育 一般公共预算支出_科学技术 金融机构人民币各项存款余额_个人储蓄存款 金融机构人民币各项存款余额 金融机构人民币各项贷款余额 规模以上工业企业单位数 规模以上工业企业单位数_内资企业 规模以上工业企业单位数_港澳台商投资企业 规模以上工业企业单位数_外商投资企业 规模以上工业总产值 规模以上工业总产值_内资企业 规模以上工业总产值_港澳台商投资企业 规模以上工业总产值_外商投资企业 规模以上工业企业流动资产合计 规模以上工业企业固定资产合计 规模以上工业企业利润总额 规模以上工业企业应交增值税 规模以上工业企业主营业务税金及附加 户籍人口数 年均户籍人口数 户籍人口自然增长率 第一产业就业人员占全部城镇单位就业人员比重 第二产业就业人员占全部城镇单位就业人员比重 第三产业就业人员占全部城镇单位就业人员比重 城镇非私营单位就业人员数 城镇非私营单位就业人员数_第一产业 城镇非私营单位就业人员数_第二产业 城镇非私营单位就业人员数_第三产业 城镇非私营单位就业人员数_农、林、牧、渔业 城镇非私营单位就业人员数_采矿业 城镇非私营单位就业人员数_制造业 城镇非私营单位就业人员数_电力、热力、燃气及水生产和供应业 城镇非私营单位就业人员数_建筑业 城镇非私营单位就业人员数_批发和零售业 城镇非私营单位就业人员数_交通运输、仓储和邮政业 城镇非私营单位就业人员数_住宿和餐饮业 城镇非私营单位就业人员数_信息传输、软件和信息技术服务业 城镇非私营单位就业人员数_金融业 城镇非私营单位就业人员数_房地产业 城镇非私营单位就业人员数_租赁和商务服务业 城镇非私营单位就业人员数_科学研究和技术服务业 城镇非私营单位就业人员数_水利、环境和公共设施管理业 城镇非私营单位就业人员数_居民服务、修理和其他服务业 城镇非私营单位就业人员数_教育 城镇非私营单位就业人员数_卫生和社会工作 城镇非私营单位就业人员数_文化、体育和娱乐业 城镇非私营单位就业人员数_公共管理、社会保障和社会组织 城镇非私营单位在岗职工平均人数 城镇就业人员数_私营企业和个体 城镇非私营单位在岗职工工资总额 城镇非私营单位在岗职工平均工资 城镇登记失业人员数 建成区面积 建设用地面积 建设用地面积_居住用地 液化石油气供气总量 液化石油气供气总量_居民家庭 人工煤气、天然气供气总量 人工煤气、天然气供气总量_居民家庭 液化石油气用气人口 人工煤气、天然气用气人口 城市公共汽电车运营车辆数 城市出租汽车运营车辆数 城市公共汽电车客运总量 道路面积 排水管道长度 建成区绿化覆盖面积 建成区绿化覆盖率 绿地面积 公园绿地面积 维护建设资金支出 土地面积 生活用水供水量 供水总量 全社会用电量 城乡居民生活用电量 工业生产用电量 房地产开发投资 房地产开发投资_住宅 限额以上批发和零售业法人单位数 限额以上批发和零售业商品销售总额 普通中学学校数 中等职业教育学校数 普通小学学校数 普通高等学校专任教师数 普通中学专任教师数 中等职业教育专任教师数 普通小学专任教师数 普通高等学校在校生数 普通中学在校生数 中等职业教育在校生数 普通小学在校生数 电视节目综合人口覆盖率 公共图书馆总藏量_图书 医疗卫生机构数_医院和卫生院 卫生人员数_执业(助理)医师 医疗卫生机构床位数_医院和卫生院 城镇职工基本养老保险参保人数 职工基本医疗保险参保人数 失业保险参保人数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值