gbk编码是什么意思 gbk和utf8的区别

在一台计算机中,所有的数据在存储和运算时都要用二进制数来表示(因为计算机用高电平和低电平分别表示1和0),用哪些二进制数来表示哪些符号,当然每个人都可以商定自己的一套(这叫编码),而如果每个人都想互相交流而不造成混乱,那么每个人都必须使用相同的编码规则,这就是统...

在一台计算机中,所有的数据在存储和运算时都要用二进制数来表示(因为计算机用高电平和低电平分别表示1和0),用哪些二进制数来表示哪些符号,当然每个人都可以商定自己的一套(这叫编码),而如果每个人都想互相交流而不造成混乱,那么每个人都必须使用相同的编码规则,这就是统一编码的原因。简单来说,编码就是字符和数值的对应关系。下面我们将详细介绍不同编码的编码规则和应用。

ASCII编码

ASCII码是由美国的相关标准化组织推出的。后来,它被国际标准化组织(ISO)指定为国际标准,称为ISO ***6标准。标准统一规定了像A、B、C、D这样的常用字符(52个字母(包括大写字母),0、1这样的数字,以及一些常用符号(例如:%,!、+等。)共128个字符)。ASCII分为标准的ASCII码,用7位二进制数组合表示128个字符,扩展的ASCII 8位二进制数组合表示256个字符。

标准ASCII

0-127包含的代码称为标准ASCII码,如:空空格为32(二进制0010000),大写字母A为97(二进制01100001)。这128个符号(包括32个不能打印的控制符号)只占用一个字节的后7位(8位),第一位统一规定为0。

以下是标准ASCII代码表:

扩展ASCII码之后的128个码称为扩展ASCII码。扩展ASCII码允许每个字符的第8位用于确定额外的128个特殊符号字符、外来词和图形符号;

以下是扩展的ASCII代码表:

在python中,可以使用内置函数ord()来查看的单个字符的ASCII代码,例如:

>>> ord('a')97

ord()函数的本质是返回与字符的Unicode代码相对应的十进制值。例如

>>> ord("国")22269

此外,ord()反函数chr()查看与代码对应的字符,例如:

>>> chr(97)'a'>>> chr(22269)'国'

GBK

ASCII编码不支持中文,但需要找到一种支持中文的编码方式。所以中国人定义了一套编码规则:当一个字符小于127位时,和ASCII字符一样,但当两个大于127的字符连在一起,就代表一个汉字。第一个字节称为高字节(从0xA1-0xF7),第二个字节为低字节(从0xA1-0xFE),这样就可以组合7000多个简体字。这个规则叫做GB2312。

因为中国汉字多,有些字还是不能表达,所以重新定义了规则:不要求低位字节必须是127之后的代码。

只要第一个字节大于127,它就会是一个汉字的开头

,不管后面是否跟有扩展字符集的内容。这个扩展编码方案被称为

GBK

,包含了GB2312的全部内容,新增汉字(包括繁体字)和符号近2万个。但是,中国有56个民族,每个民族都有自己的性格。因此,GBK的编码规则得到了扩展,增加了近千个少数民族文字。扩展后的代码称为GB18030,GB18030字符中包含了GBK字符,基本上向后兼容GBK。GB18030包含70,244个汉字。

在Python中使用gbk和gb18030编码’韩’单词:

>>> "韩".encode("gb18030")b'xbaxab'>>> "韩".encode("gbk")b'xbaxab'

ANSI:

为了使计算机支持更多的语言,通常用0x80~0xFFFF范围内的2个字节来表示1个字符。比如:汉字‘’在中文操作系统中,0xD6和0xD0用于存储。然而,不同的国家和地区制定了不同的标准,产生了GB2312、GBK、GB18030、Big5、Shift_JIS等各自的编码标准。

这些使用多个字节表示一个字符的各种扩展编码方法称为ANSI编码。在简体中文Windows操作系统中,ANSI码代表GBK码

在繁体中文Windows操作系统中,ANSI代码代表Big 5;在日文Windows操作系统中,ANSI代码代表Shift_JIS代码。

不同的ANSI代码互不兼容。在国际间交换信息时,不可能在同一个ANSI编码文本中存储属于两种语言的单词。ANSI编码对英文字符使用一个字节,对中文字符使用两个或四个字节。

Unicode

因为世界上有很多国家,每个国家都定义了一套自己的编码标准,结果是无法解析代码来互相交流,所以ISO(国际标准化组织)决定定义一个编码方案来解决所有国家的编码问题。这种新的编码方案被称为Unicode。注意

Unicode并不是一个新的编码规则,而是一组字符集(每个“字符”被分配一个唯一的ID(学名为Code Point/码点))

。Unicode可以理解为世界代码的字典。可以查询具体的符号对应表,也可以查询特殊的汉字对应表。

Python中查看字符对应的Unicode值的方法;

>>> "中".encode("unicode_escape")b'\u4e2d'>>> b'\u4e2d'.decode("unicode_escape")'中'

需要注意的是,Unicode只是一个符号集。它只指定了一个符号的二进制代码,但没有指定这个二进制代码应该如何存储。比如汉字的严格Unicode是十六进制数4E25,换算成二进制数有15位(1001110 00***1)。也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或4个字节,甚至更多。这里有几个严重的问题。第一个是,计算机如何区分Unicode和ASCII?而计算机又是如何知道三个字节分别代表一个符号而不是三个符号的呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了。如果Unicode统一规定每个符号用三个或四个字节表示,那么每个英文字母前的两三个字节必须是0,对于存储或传输来说是极大的浪费,文本文件的大小会大两三倍,这是不可接受的。因此,存储Unicode的方式有很多种,也就是说,可以用很多种不同的二进制格式来表示Unicode。也导致了Unicode在很长一段时间内无法普及,直到UTF编码出现。

UTF-8编码

由于Unicode浪费网络和硬盘资源,为了解决这个问题,在Unicode的基础上定制了一套编码规则(将“码位”转换成字节序列的规则[编码/解码可以理解为加密/解密的过程])。这种新的编码规则是UTF-8。UTF-8使用1-4个字符来传输和存储数据。它是Unicode的可变长度字符编码,也称为通用代码。

Unicode和Utf-8编码规则:使用以下模板进行相互翻译

Unicode符号范围(十六进制)| UTF 8编码方法(二进制)

————————————————————————

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110 xxxxx 10 xxxxx

0000 0800-0000 FFFF | 1110 xxxxx 10 xxxxx 10 xxxxx

0001 0000-0010 FFFF | 11110 xxxxx 10 xxxxx 10 xxxxx 10 xxxxx

Unicode字符通过向相应的模板添加标志位以Utf-8编码。比如:””Unicode编码是\u8ff7,用二进制表示为:10001111110111,8ff7在第三个模板范围内,100011111110111按照模板分为三部分:10011111111111111011,那么带标志位的二进制为:

1110

1000

10

10?e8bfb7?”

Python中的Unicode字符转换为UTF 8编码:

>>>'迷'.encode('utf-8')b'xe8xbfxb7'

那么如何区分utf-8的字符呢?Utf-8根据编码的高位字节来区分每个字符的开头,比如一个字节代表一个字符,第一个字节的高位为”0″开始;用两个字节表示的字符,第一个字节的高位是”110″开头,后跟一个带”10开头”;一个由三个字节表示的字符,第一个字节以”1110″开始时,最后两个字节以”10″开始;由四个字段表示的一种字符,其第一个字节以”11110″开始时,以下三个字节以”10″开始。这样,计算机就能识别出每个字符由几个字节组成,并能显示正确的信息。

UTF-8和Unicode转换

比如汉字”智慧”,utf-8编码是”xe6x99xba & # 8221对应的二进制是:”11100110 10011001 10111010″,由于utf-8中的一个汉字是3个字节,对应的模板是:

0000 0800-0000 FFFF | 1110 xxxxx 10 xxxxx 10 xxxxx

1100110 10011001 1011010 | UTF-8编码的二进制1110xxxx 10xxxxxx 10xxxxxx |对应的模板0110 01101 11010 |去掉模板中的标志位后,0110110 011111010表示十六进制的667A,所以按照规则转换得到”智慧”Unicode的编码是667A。

同样,根据字符在Unicode中的编码位置,也可以找到对应的utf-8编码。比如:UTF-8编码:xe8xbfxb7,用二进制表示为:11101000 1011111110111。有3个字节属于第三个模板范围。按照模板去掉标志位后,就是:1000 111111 110111。结果是’’单词的Unicode字符

8ff7

>>> b'\u8ff7'.decode('unicode_escape')'迷'

Unicode和GBK

之间的转换

Unicode GBK和Unicode GBK是两种完全不同的字符编码方案,它们之间没有直接的关系。如果你想分阶段进行

相互转换,最直接高效的方法就是查询各自的性格对照表。

Python实现了Unicode和GBK之间的转换(Unicode对应值转换方法:\u8ff7到GBK字符):

>>> l_u = b'\u8ff7'.decode('unicode_escape')>>> l_u.encode('gbk')b'xc3xd4'

UTF-8、Unicode和GBK之间的关系

Utf-8(utf-16)====编码= = = Unicode = = = =编码= = = = GBK (ANSI)

utf-8(utf-16)= = = = =解码= ====Unicode=== = =解码= = = = = GBK (ANSI)

概要:Unicode字符可以被编码成UTF-8和GBK。相反,UTF-8和GBK也可以被解码得到Unicode。但是,GBK和UTF-8之间没有直接转换,所以只能转换为Unicode,然后再转换为另一种编码。所谓编码转换,其实就是数值和字符之间的转换。

URL编码/解码

URL代码是字符ascii代码的十六进制形式。不过有一点小变化,需要补充一下”%”。比如””,它的ascii码是92,十六进制码是5c,所以””的URL编码是%5c。汉字的网址编码呢?非常简单,非ASCII字符通常有两种编码方式,分别是GBK编码和UTF8编码。比如:””对应于xe8xbfxb7的UTF-8编码,则”胡”的URL代码是%E8%BF%B7。解码方法是去掉%,然后UTF-8解码,就可以得到实际的字符。

计算机用什么代码存储和传输数据?

支持Unicode的应用程序(python,VS,VC,Google Chrome,notepad等。)被大多数程序支持(部分程序需要设置编码)。

不支持Unicode(易语言等)的应用程序。)将以控制面板-区域管理中设置的代码(ANSI)存储,如简体中文(GBK)、繁体中文(Big5)等。

比如以国产编程语言‘易语言’为例,看看内存中存储了哪些代码变量。

a = "你"调试输出 (取指针地址_文本型 (a))* 196***20

根据CE,这个内存地址中对应的值是0000E3C4,而”你”GBK的代码正是:E3C4。因此,易语言软件使用GBK电码来存储和传输数据。

再看一下数据是如何存储在内存中的:

使用OD查看

使用CE查看

多字符变量”你好”GBK字符:c4e3bac3b0a1

外径:

CE(8字节显示):

可以看出,内存存储编码方式与软件支持的编码方式一致(易语言:GBK字符;Python:Unicode字符);计算机内存数据存储一般采用

Big-endian模式(高内存位对低数据位,低内存位对高数据位)。OD默认从低到高内存显示数据,CE默认从高到低内存显示数据,所以看到的十六进制值是相反的。根据变量的数据类型,将应用相应大小的内存进行存储。

本文来自习惯有你投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/577982.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 06-05
下一篇 06-05

相关推荐

  • gbk编码是什么意思 gbk和utf8的区别

    在一台计算机中,所有的数据在存储和运算时都要用二进制数来表示(因为计算机用高电平和低电平分别表示1和0),用哪些二进制数来表示哪些符号,当然每个人都可以商定自己的一套(这叫编码),而如果每个人都想互相交流而不造成混乱,那么每个人都必须使用相同的编码规则,这就是统

    2023-06-05 08:39:01
    193 0
  • gbk编码转换器手机版 gbk汉字编码查询

    最早的字符串编码是美国标准信息交换码,即ASCII码。它只对10个数字、26个大写英文字母、26个小写英文字母和一些其他符号进行编码。ASCII码最多只能表示256个符号,每个符号占用一个字节。随着信息技术的发展,各国的文字都需要编码,于是出现了GBK、GB2312、UTF-8编码等。其

    2023-05-26 06:28:01
    353 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信