unicode与ascii的那些事

ASCII码的由来

计算机发明后,为了在计算机中表示字符,人们制定了一种编码,叫ASCII码。ASCII码由一个字节中的7位(bit)表示,范围是0x00 - 0x7F 共128个字符。
    后来他们突然发现,如果需要按照表格方式打印这些字符的时候,缺少了“制表符”。于是又扩展了ASCII的定义,使用一个字节的全部8位(bit)来表示字符了,这就叫扩展ASCII码。范围是0x00 - 0xFF 共256个字符。

Unicode详细介绍

1.容易产生后歧义的两字节

unicode的第一个版本是用两个字节(16bit)来表示所有字符。实际上这么说容易让人产生歧义,我们总觉得两个字节就代表保存在计算机中时是两个字节。于是任何字符如果用unicode表示的话保存下来都占两个字节,其实这种说法是错误的。

其实Unicode涉及到两个步骤,首先是定义一个规范,给所有的字符指定一个唯一对应的数字,这完全是数学问题,可以说跟计算机没关系。第二步才是怎么把字符对应的数字保存在计算机中,这才涉及到实际在计算机中占多少字节空间。

所以我们也可以这样理解,Unicode是用0至65535之间的数字来表示所有字符。其中0至127这128个数字表示的字符仍然跟ASCII完全一样。65536是2的16次方,这是第一步。第二步就是怎么把0至65535这些数字转化成01串保存到计算机中,这肯定就有不同的保存方式了。于是出现了UTF(unicode transformation format),有UTF-8,UTF-16。

2.UTF-8 与UTF-16的区别

UTF-16比较好理解,就是任何字符对应的数字都用两个字节来保存。我们通常对Unicode的误解就是把Unicode与UTF-16等同了,但是很显然如果都是英文字母这做有点浪费,明明用一个字节能表示一个字符为啥整两个啊。

于是又有个UTF-8,这里的8非常容易误导人,8不是指一个字节。难道一个字节表示一个字符?实际上不是,当用UTF-8时表示一个字符是可变的,有可能是用一个字节表示一个字符,也可能是两个,最多三个。也就是说UTF-8能用1~3字节表示字符,而实际大小是可动态变化,根据字符对应的数字大小来确定

于是UTF-8和UTF-16的优劣很容易就看出来了。如果全部英文或英文与其他文字混合,但英文占绝大部分,用UTF-8就比UTF-16节省了很多空间。而如果全部是中文这样类似的字符或者混合字符中中文占绝大多数。UTF-16就占优势了,可以节省很多空间,当然还有个容错问题。

举个例子,假如中文字"汉"对应的unicode是6C49(这是用十六进制表示,用十进制表示是27721为啥不用十进制表示呢?很明显用十六进制表示要短点.其实都是等价的没啥不一样,就跟你说60分钟和1小时一样。你可能会问当用程序打开一个文件时我们怎么知道那是用的UTF-8还是UTF-16呢?自然会有点啥标志,在文件的开头几个字节就是标志。

EF BB BF 表示UTF-8

FE FF 表示UTF-16。

时间: 2024-10-10 05:28:39

unicode与ascii的那些事的相关文章

Unicode 和ASCII码

在Unicode中:汉字"字"对应的数字是23383(十进制),十六进制表示为5B57.在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8.UTF-16.UTF-32.UTF是"UCS Transformation Format"的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据.例如,"汉字"对应的数字是0x6c49和0x5b57,而编码的程序数据是: 1 2 3

UNICODE与ASCII

1.ASCII的特点 ASCII 是用来表示英文字符的一种编码规范.每个ASCII字符占用1 个字节,因此,ASCII 编码可以表示的最大字符数是255(00H—FFH).这对于英文而言,是没有问题的,一般只什么用到前128个(00H--7FH,最高位为0).而最高位为1 的另128 个字符(80H—FFH)被称为“扩展ASCII”,一般用来存放英文的制表符.部分音标字符等等的一些其它符号. 但是对于中文等比较复杂的语言,255个字符显然不够用.于是,各个国家纷纷制定了自己的文字编码规范,其中中

创建文件夹并解决解决unicode和ASCII码转换的问题

# -*- coding: UTF-8 -*-import sysimport timeimport os #解决unicode和ASCII码转换的问题reload(sys) #解决unicode和ASCII码转换的问题sys.setdefaultencoding('utf8') #解决unicode和ASCII码转换的问题 context = '''hello world'''f = open("hello.txt", 'a+')f.write(context)f.close()da

Unicode和Ascii的区别

①ASCII就是编码英文的26个字母和一些常见的符号,之后扩展了一半.总之是一个字节来做编码,大于128的部分是一些特殊符号.但ASCII是无法编码别的东西的,比如说是不存在"中文的ascii码需要2个字符"这种说法的.ASCII就只有一个字节. ②Unicode是足够编码地球上所有的语言了,所以ASCII中所能表示的,Unicode当然全部包括了.Unicode本身是只有2个字节的,之所以出现UTF-8,UTF-16等等之类,那是为了针对不同的应用环境,提高整体编码效率,比如如果某篇

自己写unicode转换ascii码,wchar*到char*

对于ascii码的char其实就是unicode码wchar的首个字节码, 如wchar[20] = "qqqq"; 在内存中排码其实是char的'q' '\0'这类,因此我们如果自己写unicode码转换为ascii的char,只需要取其首字节即可,如下本人写了一个wchar到char的转换的函数.由于代码简单,加上了内存泄露测试方式. #include <stdio.h> #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLI

unicode utf-8 ascii 区别与联系

unicode是一种标准,utf-8是这种标准的一种编码方式,ascii也是一种编码方式, 一个汉字在unicode标准中占两个byte 中文汉字的unicode范围:4E00~9FA5 一个汉字在utf-8编码中占三个byte 中文汉字的utf-8编码范围:E4B880~E9BEA0 计算机中都是以字符流(byte)进行传输的,因此判定段字符流中的某一个是否是汉字,只需首先确定其是utf-8编码,然后判定其范围在E4B880~E9BEA0中即可

Unicode, UTF, ASCII, ANSI format differences

Going down your list: "Unicode" isn't an encoding, although unfortunately, a lot of documentation imprecisely uses it to refer to whichever Unicode encoding that particular system uses by default. On Windows and Java, this often means UTF-16; in

Visual Studio的Unicode和ASCII

Visual C++自2005版之后,工程的默认字符集属性改为使用宽字符集(Unicode),因此默认情况下不应使用多字节字符集(ASCII). 这个改动让我们从网上.书上等处获取的代码无法正常编译.例如下面这个基于控制台.获取文件绝对路径的程序. #include<windows.h> #include<stdio.h> int main() { char szDir[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szDir); printf(&

unicode 、utf-8 、utf-16、ascii 、gbk 、gb2312 的区别

很久很久以前,有一群人,他们决定用8个可以开合的晶体管来组合成不同的状态,以表示世界上的万物.他们看到8个开关状态是好的,于是他们把这称为"字节".再后来,他们又做了一些可以处理这些字节的机器,机器开动了,可以用字节来组合出很多状态,状态开始变来变去.他们看到这样是好的,于是它们就这机器称为"计算机". 开始计算机只在美国用.八位的字节一共可以组合出256(2的8次方)种不同的状态. 他们把其中的编号从0开始的32种状态分别规定了特殊的用途,一但终端.打印机遇上约定