ASCII编码、Unicode字符编码规范

作者:小菜 更新时间:2025-02-26 点击数:
简介:Unicode是一种字符编码规范 。

先从ASCII说起。

ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits) 因此,AS

【菜科解读】

Unicode是一种字符编码规范 。

先从ASCII说起。

ASCII是用来表示英文字符的一种编码规范,每个ASCII字符占用1个字节(8bits) 因此,ASCII编码可以表示的最大字符数是256,其实英文字符并没有那么多,一般只用前128个(最高位为0),其中包括了控制字符、数字、大小写字母和其他一些符号 。

而最高位为1的另128个字符被成为“扩展ASCII”,一般用来存放英文的制表符、部分音标字符等等的一些其他符号,这种字符编码规范显然用来处理英文没有什么问题。

(实际上也可以用来处理法文、德文等一些其他的西欧字符,但是不能和英文通用),但是面对中文、阿拉伯文之类复杂的文字,255个字符显然不够用 于是,各个国家纷纷制定了自己的文字编码规范,其中中文的文字编码规范叫做“GB2312-80”,它是和ASCII兼容的一种编码规范,其实就是利用扩展ASCII没有真正标准化这一点,把一个中文字符用两个扩展ASCII字符来表示。

但是这个方法有问题,最大的问题就是,中文文字没有真正属于自己的编码,因为扩展ASCII码虽然没有真正的标准化,但是PC里的ASCII码还是有一个事实标准的(存放着英文制表符),所以很多软件利用这些符号来画表格。

这样的软件用到中文系统中,这些表格符就会被误认作中文字,破坏版面。

而且,统计中英文混合字符串中的字数,也是比较复杂的,我们必须判断一个ASCII码是否扩展,以及它的下一个ASCII是否扩展,然后才“猜”那可能是一个中文字 。

总之当时处理中文是很痛苦的。

而更痛苦的是GB2312是国家标准,台湾当时有一个Big5编码标准,很多编码和GB是相同的,所以……,嘿嘿。

这时候,我们就知道,要真正解决中文问题,不能从扩展ASCII的角度入手,也不能仅靠中国一家来解决。

而必须有一个全新的编码系统,这个系统要可以将中文、英文、法文、德文……等等所有的文字统一起来考虑,为每个文字都分配一个单独的编码,这样才不会有上面那种现象出现。

于是,Unicode诞生了。

Unicode有两套标准,一套叫UCS-2(Unicode-16),用2个字节为字符编码,另一套叫UCS-4(Unicode-32),用4个字节为字符编码。

以目前常用的UCS-2为例,它可以表示的字符数为2^16=65535,基本上可以容纳所有的欧美字符和绝大部分的亚洲字符 。

UTF-8的问题后面会提到 。

在Unicode里,所有的字符被一视同仁。

汉字不再使用“两个扩展ASCII”,而是使用“1个Unicode”,注意,现在的汉字是“一个字符”了,于是,拆字、统计字数这些问题也就自然而然的解决了 。

但是,这个世界不是理想的,不可能在一夜之间所有的系统都使用Unicode来处理字符,所以Unicode在诞生之日,就必须考虑一个严峻的问题:和ASCII字符集之间的不兼容问题。

我们知道,ASCII字符是单个字节的,比如“A”的ASCII是65。

而Unicode是双字节的,比如“A”的Unicode是0065,这就造成了一个非常大的问题:以前处理ASCII的那套机制不能被用来处理Unicode了 。

另一个更加严重的问题是,c语言使用'\0'作为字符串结尾,而Unicode里恰恰有很多字符都有一个字节为0,这样一来,C语言的字符串函数将无法正常处理Unicode,除非把世界上所有用C写的程序以及他们所用的函数库全部换掉 。

于是,比Unicode更伟大的东东诞生了,之所以说它更伟大是因为它让Unicode不再存在于纸上,而是真实的存在于我们大家的电脑中。

那就是:UTF。

UTF= UCS Transformation Format UCS转换格式,它是将Unicode编码规则和计算机的实际编码对应起来的一个规则。

现在流行的UTF有2种:UTF-8和UTF-16 。

其中UTF-16和上面提到的Unicode本身的编码规范是一致的,这里不多说了。

而UTF-8不同,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼容 。

UTF-8有点类似于Haffman编码,它将Unicode编码为00000000-0000007F的字符,用单个字节来表示; 00000080-000007FF的字符用两个字节表示 00000800-0000FFFF的字符用3字节表示 因为目前为止Unicode-16规范没有指定FFFF以上的字符,所以UTF-8最多是使用3个字节来表示一个字符。

但理论上来说,UTF-8最多需要用6字节表示一个字符。

在UTF-8里,英文字符仍然跟ASCII编码一样,因此原先的函数库可以继续使用。

而中文的编码范围是在0080-07FF之间,因此是2个字节表示(但这两个字节和GB编码的两个字节是不同的),用专门的Unicode处理类可以对UTF编码进行处理。

下面说说中文的问题。

由于历史的原因,在Unicode之前,一共存在过3套中文编码标准。

GB2312-80,是中国大陆使用的国家标准,其中一共编码了6763个常用简体汉字。

Big5,是台湾使用的编码标准,编码了台湾使用的繁体汉字,大概有8千多个。

HKSCS,是中国香港使用的编码标准,字体也是繁体,但跟Big5有所不同。

这3套编码标准都采用了两个扩展ASCII的方法,因此,几套编码互不兼容,而且编码区间也各有不同 因为其不兼容性,在同一个系统中同时显示GB和Big5基本上是不可能的。

当时的南极星、RichWin等等软件,在自动识别中文编码、自动显示正确编码方面都做了很多努力。

他们用了怎样的技术我就不得而知了,我知道好像南极星曾经以同屏显示繁简中文为卖点。

后来,由于各方面的原因,国际上又制定了针对中文的统一字符集GBK和GB18030,其中GBK已经在Windows、Linux等多种操作系统中被实现。

GBK兼容GB2312,并增加了大量不常用汉字,还加入了几乎所有的Big5中的繁体汉字。

但是GBK中的繁体汉字和Big5中的几乎不兼容。

GB18030相当于是GBK的超集,比GBK包含的字符更多。

据我所知目前还没有操作系统直接支持GB18030。

谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词 这是一篇程序员写给程序员的趣味读物。

所谓趣味是指可以比较轻松地了解一些原来不清楚的概念,增进知识,类似于打RPG游戏的升级。

整理这篇文章的动机是两个问题: 问题一: 使用Windows记事本的“另存为”,可以在GBK、Unicode、Unicode big endian和UTF-8这几种编码方式间相互转换。

同样是txt文件,Windows是怎样识别编码方式的呢? 我很早前就发现Unicode、Unicode big endian和UTF-8编码的txt文件的开头会多出几个字节,分别是FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8)。

但这些标记是基于什么标准呢? 问题二: 最近在网上看到一个ConvertUTF.c,实现了UTF-32、UTF-16和UTF-8这三种编码方式的相互转换。

对于Unicode(UCS2)、GBK、UTF-8这些编码方式,我原来就了解。

但这个程序让我有些糊涂,想不起来UTF-16和UCS2有什么关系。

查了查相关资料,总算将这些问题弄清楚了,顺带也了解了一些Unicode的细节。

写成一篇文章,送给有过类似疑问的朋友。

本文在写作时尽量做到通俗易懂,但要求读者知道什么是字节,什么是十六进制。

0、big endian和little endian big endian和little endian是CPU处理多字节数的不同方式。

例如“汉”字的Unicode编码是6C49。

那么写到文件里时,究竟是将6C写在前面,还是将49写在前面?如果将6C写在前面,就是big endian。

还是将49写在前面,就是little endian。

“endian”这个词出自《格列佛游记》。

小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。

我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。

1、字符编码、内码,顺带介绍汉字编码字符必须编码后才能被计算机处理。

计算机使用的缺省编码方式就是计算机的内码。

早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5。

GB2312(1980年)一共收录了7445个字符,包括6763个汉字和682个其它符号。

汉字区的内码范围高字节从B0-F7,低字节从A1-FE,占用的码位是72*94=6768。

其中有5个空位是D7FA-D7FE。

GB2312支持的汉字太少。

1995年的汉字扩展规范GBK1.0收录了21886个符号,它分为汉字区和图形符号区。

汉字区包括21003个字符。

2000年的GB18030是取代GBK1.0的正式国家标准。

该标准收录了27484个汉字,同时还收录了藏文、蒙文、维吾尔文等主要的少数民族文字。

现在的PC平台必须支持GB18030,对嵌入式产品暂不作要求。

所以手机、MP3一般只支持GB2312。

从ASCII、GB2312、GBK到GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。

在这些编码中,英文和中文可以统一地处理。

区分中文编码的方法是高字节的最高位不为0。

按照程序员的称呼,GB2312、GBK到GB18030都属于双字节字符集 (DBCS)。

有的中文Windows的缺省内码还是GBK,可以通过GB18030升级包升级到GB18030。

不过GB18030相对GBK增加的字符,普通人是很难用到的,通常我们还是用GBK指代中文Windows内码。

这里还有一些细节: GB2312的原文还是区位码,从区位码到内码,需要在高字节和低字节上分别加上A0。

在DBCS中,GB内码的存储格式始终是big endian,即高位在前。

GB2312的两个字节的最高位都是1。

但符合这个条件的码位只有128*128=16384个。

所以GBK和GB18030的低字节最高位都可能不是1。

不过这不影响DBCS字符流的解析:在读取DBCS字符流时,只要遇到高位为1的字节,就可以将下两个字节作为一个双字节编码,而不用管低字节的高位是什么。

2、Unicode、UCS和UTF前面提到从ASCII、GB2312、GBK到GB18030的编码方法是向下兼容的。

而Unicode只与ASCII兼容(更准确地说,是与ISO-8859-1兼容),与GB码不兼容。

例如“汉”字的Unicode编码是6C49,而GB码是BABA。

Unicode也是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。

Unicode的学名"Universal Multiple-Octet Coded Character Set",简称为UCS。

UCS可以看作是"Unicode Character Set"的缩写。

根据维基百科全书(http://zh.wikipedia.org/wiki/)的记载:历史上存在两个试图独立设计Unicode的组织,即国际标准化组织(ISO)和一个软件制造商的协会(unicode.org)。

ISO开发了ISO 10646项目,Unicode协会开发了Unicode项目。

在1991年前后,双方都认识到世界不需要两个不兼容的字符集。

于是它们开始合并双方的工作成果,并为创立一个单一编码表而协同工作。

从Unicode2.0开始,Unicode项目采用了与ISO 10646-1相同的字库和字码。

目前两个项目仍都存在,并独立地公布各自的标准。

Unicode协会现在的最新版本是2005年的Unicode 4.1.0。

ISO的最新标准是10646-3:2003。

UCS规定了怎么用多个字节表示各种文字。

怎样传输这些编码,是由UTF(UCS Transformation Format)规范规定的,常见的UTF规范包括UTF-8、UTF-7、UTF-16。

IETF的RFC2781和RFC3629以RFC的一贯风格,清晰、明快又不失严谨地描述了UTF-16和UTF-8的编码方法。

我总是记不得IETF是Internet Engineering Task Force的缩写。

但IETF负责维护的RFC是Internet上一切规范的基础。

3、UCS-2、UCS-4、BMP UCS有两种格式:UCS-2和UCS-4。

顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。

下面让我们做一些简单的数学游戏: UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS-4根据最高位为0的最高字节分成2^7=128个group。

每个group再根据次高字节分为256个plane。

每个plane根据第3个字节分为256行 (rows),每行包含256个cells。

当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。

或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。

在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。

而目前的UCS-4规范中还没有任何字符被分配在BMP之外。

4、UTF编码 UTF-8就是以8位为单元对UCS进行编码。

从UCS-2到UTF-8的编码方式如下: UCS-2编码(16进制) UTF-8 字节流(二进制) 0000 - 007F 0xxxxxxx 0080 - 07FF 110xxxxx 10xxxxxx 0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx 例如“汉”字的Unicode编码是6C49。

6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。

将6C49写成二进制是:0110 110001 001001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

读者可以用记事本测试一下我们的编码是否正确。

UTF-16以16位为单元对UCS进行编码。

对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。

对于不小于0x10000的UCS码,定义了一个算法。

不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。

但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。

5、UTF的字节序和BOM UTF-8以字节为编码单元,没有字节序的问题。

UTF-16以两个字节为编码单元,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序。

例如收到一个“奎”的Unicode编码是594E,“乙”的Unicode编码是4E59。

如果我们收到UTF-16字节流“594E”,那么这是“奎”还是“乙”? Unicode规范中推荐的标记字节顺序的方法是BOM。

BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。

BOM是一个有点小聪明的想法: 在UCS编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。

而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。

UCS规范建议我们在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。

因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。

UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。

字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF(读者可以用我们前面介绍的编码方法验证一下)。

所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。

Windows就是使用BOM来标记文本文件的编码方式的。

ASCII,编码,、,Unicode,字符,规范,Unico

长翅龙占丽鱼:尼罗罗非鱼?分布在非洲、中南美热带地区

大部分人都是在陆地上生活,因此有时候会觉得地球上的陆地面积非常大,但是本来地球上陆地的面积只占到百分之二十九左右,其他都是海洋,所以海洋中还有许多地方没有被人类探索到,其中就有许多鱼类是我们人类不了解的,比如说长翅龙占丽鱼,那么接下来我们就一起去了解一下这个鱼。

长翅龙占丽鱼长翅龙占丽鱼是一种非洲鲫鱼,属于隆头鱼亚目丽鱼科,现在被我国当作养殖对象之一,也被叫做尼罗罗非鱼,长得非常像鲫鱼。

长翅龙占丽鱼重要分布在热带海水或淡水中,重要是在非洲及中南美的热带何川和湖泊之中。

长翅龙占丽鱼体型比较高但短,被栉鳞,侧线中断,是一种杂食性的鱼,身上呈暗褐色,其中有些鱼的身上还会有一些黑色的斑点。

长翅鱼是什么鱼长翅鱼是一类鱼的俗称,因为这些鱼有一些又大有长的鱼鳍,看起来就像翅膀一样,因此被人们认为张了翅膀,因此这一类鱼就被人们叫做长翅鱼,比如说飞鱼的鱼鳍就很长,并且十分有力,还能在水面上滑翔,看起来就像在飞一样,所以被人们叫做飞鱼,飞鱼也是长翅鱼的一种。

没翅膀的鱼现在发现的大部分的鱼都是没有翅膀的,但是有些鱼还是能够利用自身的力量和胸鳍在水面上滑翔,比如说银汉鱼目飞鱼科的飞鱼就是一种能够飞翔的鱼,不过它也算不上在飞,并且它只是胸鳍之类的比较长,并不是说就是有翅膀的鱼,一般来说鱼就是没有翅膀的,那些认为鱼有翅膀的只是对于鱼生长出来的胸鳍或尾鳍的一种误解。

南方人、北方人谁更胖?真相你想不到

南方人比北方人瘦,是错觉吗?真不是。

2017年,中国疾病控制中心发布的《慢性病及其危险因素监测数据》显示:北方地区肥胖率明显高于南方。

在超重率上,大部分北方省份的超重水平也是高于南方。

图片来源:@人民日报01、如何判断是否肥胖?很多人判断自己胖不胖,可能就是照镜子看体型,捏肚子有没有肥肉。

其实这些做法都不准确。

目前国际上常用的衡量人体体重是否超重、肥胖、是否健康的一个标准是看体质指数 BMI(Body Mass Index,简称BMI),也有叫它为身体质量指数、体重指数的。

BMI的计算公式为BMI = 体重(kg)身高2(m),就是用你的体重除以身高的平方。

图片来源:中国居民膳食指南(2022)根据计算数值,BMI处于 18.5-24.0 之间的就是健康体重。

如果 BMI 处于 24.0-28.0 之间,就是“超重”;如果 BMI 都大于 28.0 了,说明是“肥胖”。

有些人看上去有点胖,捏肚子有赘肉,或者感觉自己胖,不一定是真的肥胖。

不过需要提醒大家,在 BMI 超重人群中,体重越重则发展为肥胖的几率越大。

如果你超重了,那就要开始注意控制了。

02、影响体重的因素为什么会这样呢?哪些因素会影响肥胖?1.基因我们的体重会受到遗传因素的影响。

这一点在生活中其实很容易见到,比如如果你看到一家人,爸爸妈妈很胖,通常孩子也会胖。

这就是基因遗传。

2.新陈代谢新陈代谢是指身体内发生的维持生命所必需的化学过程。

不同的人,新陈代谢也会不一样,也会影响体重。

比如身体的基础代谢率,有些人的基础代谢率高,跟你吃了同样的食物、做了同样的工作,消耗的热量却比你高好几百大卡。

所以你就更容易胖,但他就不会。

在动物身上,我们常用饲料转化率来评价动物转化食物的效率。

其实,人也有类似的效果。

有些人的食物能量转化率高,比如吃同样的食物,你转化成能量储存在体内的比人家多,你就更容易胖。

3.年龄随着年龄的增长,身体成分与基础代谢都会发生变化,比如身体的能量代谢率会变小,体力活动也会变少,也会影响体重。

4.疾病一些疾病也会影响体重变化,比如神经性厌食、慢性肝炎、肝硬化、癌症,会导致体重变轻。

5.饮食如果吃得多,尤其是高脂肪、高糖、高能量食物吃得多,比如炸鸡、薯条等等,过多的能量就会使我们的体重增加。

6.身体活动身体活动,比如跑步、快走,甚至做家务,都会消耗体内能量。

但是如果身体活动变少,能量消耗太少,体重也会增加 。

03、为什么北方人比南方人胖?根据《慢性病及其危险因素监测数据》,我国肥胖率排名前 5 的省份分别是:第一 北京 25.9第二 河北 22.2第三 新疆 21.5第四 天津 21.2第五 黑龙江 19.8基本都是北方省份。

而肥胖率最低的几个省份分别是广西、海南、西藏、贵州、四川,基本上属于西南地区。

所以,南方人比北方人瘦可不是错觉,而是客观事实。

为什么?南北方人有何不同?1.饮食结构不同北方人多吃面食,南方人多吃米饭。

虽然它们本身都属于碳水化合物,但一个残酷的现实是——吃面食的人确实更容易胖。

西安交通大学有一个研究对我国西北地区的 10 万余名中老年人进行了调查分析后发现:喜欢吃面的人,相比于喜欢吃米的人,胖的风险更高。

尤其在男性身上更明显。

数据分析发现:以同等频率、重量的大米代替小麦(每周 5 次),与正常体重男性体脂超标风险降低 36.5% 、正常体重女性中心性肥胖风险降低 20.5% 显著相关。

为什么呢?一方面,小麦蛋白和大米蛋白对代谢的不同影响。

除了碳水化合物,小麦和大米中还有少量的蛋白质,这些蛋白质对脂肪代谢的影响是不同的。

小麦种主要是面筋蛋白,有研究认为面筋蛋白可能会通过减少组织产热和降低能量消耗,从而促进体重增长。

而大米蛋白可能通过抑制脂肪合成、增加脂肪分解的作用。

另一方面,面食和米饭的能量密度也不一样。

#p#分页标题#e#大米更能吸水,所以米饭的水分含量大,同等重量下比起来,米饭的热量低一些;但馒头、花卷的含水量只有大概是 45%-50% 的样子,烙饼更低一些,水分少、热量密度高,稍微多吃一口,摄入的热量就多不少。

2.气候不同大家都知道,北方气温一般更低、更冷,这也可能是肥胖的助攻。

北方的天气冷得早,而且冷得更持久,在极寒的黑龙江,冬季甚至可以持续半年左右。

在天气冷的情况下,我们的身体本能会储存更多的热量,也更愿意吃热乎乎高热量的食物抵御严寒,这也是为什么一到秋天就有“贴秋膘”的传统。

另外,天气冷的情况下,人们去户外运动的机会也会大幅下降,大部分时候就宅在家里了,被迫变成多吃、少动,自然更容易长胖。

而南方通常气温高,人体的能量代谢也更快,一年四季能够在户外运动的时间也更多更长,自然就没那么容易长胖。

参考文献:[1]中国居民膳食指南(2022)[2]《慢性病及其危险因素监测数据》[3]XuK, Zhang B, Liu Y, Mi B, Wang Y, Shen Y, Shi G, DangS, Liu X, Yan H. Staple Food Preference and Obesity Phenotypes: The Regional EthnicCohort Study in Northwest China. Nutrients. 2022 Dec 9;14(24):5243. doi: 10.3390/nu14245243. PMID: 36558402; PMCID: PMC9784345.[4]Santos, S.H.; et al. Wheat gluten intake increases weight gain and adiposity associatedwith reduced thermogenesis and energy expenditure in an animal model of obesity. Int. J. Obes. 2016, 40, 479–486.[5]Yang, Lin et al. “Rice protein improves adiposity, body weight and reduces lipids level in rats through modification of triglyceride metabolism.” Lipids in healthpvYyTrNQs and disease vol. 11 24. 13 Feb. 2012, doi:10.1186/1476-511X-11-24[6]栾慧, 杨林. 大米蛋白调控胆固醇代谢的研究进展[J]. 食品工业科技, 2012, 33(5):4

加入收藏
               

ASCII编码、Unicode字符编码规范

点击下载文档

格式为doc格式

  • 账号登录
社交账号登录