彻底搞懂Python字符编码:解决UnicodeEncodeError和UnicodeDecodeError错误
2025-02-27 18:02:06发布 浏览277次 信息编号:217487
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
彻底搞懂Python字符编码:解决UnicodeEncodeError和UnicodeDecodeError错误
加入微信小组或QQ组,您可以免费获得:学习教程
请参阅“微信”官方帐户的菜单以获取教程列表
无论您是经验丰富的驾驶员多年的经验还是刚刚开始,都必须遇到错误。每当您遇到错误时,我们都会一遍又一遍地将功能翻转。有时我们可以通过尝试解决问题。有时我们不禁只借用大师的帮助。但是似乎我们很少关心问题的本质。下次我们遇到类似问题时,我们会重复同样的错误。那么,您是否曾经想过一次完全编码字符代码?
在完全理解字符编码的起源之前,有必要了解一些基本概念。尽管我们每天都接触甚至使用某些概念,但我们不一定理解它们。例如:字节,字符,字符集,字符代码,字符编码。
字节
字节是计算机中数据存储的基本单元。一个字节等于8位位。计算机中的所有数据,无论是存储在磁盘文件上还是在网络上传输(文本,图片,视频,音频文件)都由字节组成。
特点
您正在阅读的文章由许多字符组成()。字符是一个信息单元,是各种字符和符号的一般术语。例如,英文字母是一个角色,汉字是一个角色,标点符号也是一个角色。
字符集
字符集(集合)是特定范围内字符的集合。不同的字符集指定字符的数量。例如,ASCII字符集共有128个字符,包括英语字母,阿拉伯数字,标点符号和控制字符。字符集定义了7445个字符,包括大多数汉字。
字符代码
代码点是指字符集中每个字符的数字。例如,ASCII字符集使用0-127连续的128个数字分别表示128个字符。例如,“ A”的字符代码编号为65。
字符编码
字符编码()是用于在字节流中映射字符代码的特定实现解决方案。常见的字符编码包括ASCII编码,UTF-8编码,GBK编码等。从某种意义上说,字符集具有与字符编码的对应关系,例如,ASCII字符集对应于ASCII编码。 ASCII字符编码指定在单个字节中低位中的7位使用以编码所有字符。例如,“ A”的数量为65,单个字节中的数字为0×41,因此将其写入存储设备时为B''。
编码,解码
编码过程是将字符转换为字节流,而解码过程是将字节流解析为字符。
在理解了这些基本术语概念之后,我们可以开始讨论计算机中编码的字符的演变。
从ASCII代码开始
说到字符编码,我们需要从计算机的诞生开始。该计算机是在美国发明的。在英语世界中,普通字符非常有限,有26个字母(容量),10个数字,标点符号和控制字符。这些字符足以由计算机中的存储空间字节表示,因为一个字节相当于8位,而8位可以代表256个符号。因此,美国国家标准协会ANSI制定了一组称为ASCII(代码)的字符编码标准,每个字符对应于一个唯一的数字,例如字符“ A”对应于65,b“ B”对应于66,等等。最早的ASCII仅定义了128个字符编码,其中包括96个字符和32个控制符号。共有128个字符仅需要7个字节来表示所有字符。因此,ASCII仅使用一个字节的最后7位,其余1位最高位作为某些通信系统的奇偶校验。下图是由ASCII代码字符编码的小数,二进制和字符的相应关系表。
扩展ASCII :( ISO/8859-1)
但是,当计算机在其他西欧地区逐渐流行时,他们发现仍然有许多西欧人物在ASCII角色集中没有发现。显然,ASCII再也无法满足人们的需求。幸运的是,ASCII字符仅使用7个字节为0×00〜0x7f,总共128个字符。因此,基于ASCII,他们将原始的7位扩展到8位,并在0×80-0xff之后使用了128个数字。它被称为,它与ASCII完全兼容。扩展符号包括表格符号,计算符号,希腊字母和特殊的拉丁符号。但是,时代是一个混乱的时代。每个制造商都有自己的想法。每个人都没有统一的标准。他们每个人都根据自己的标准实施自己的角色编码标准。越有名的是CP437。 CP437是祖先IBM PC和MS-DOS使用的字符编码,如下图所示:
许多ASCII扩展角色集是不兼容的,这导致人们无法正常交流。例如,CP437字符集中的200个字符为è,ISO/8859-1中显示的字符集为╚。因此,由国际标准化组织(ISO)和国际电力技术委员会(IEC)标准ISO/8859-1(Latin-1)共同制定了一系列8位角色集,由国际标准化组织(ISO)和国际电力技术委员会(IEC)共同制定。它继承了由CP437字符编码的128-159之间的字符,因此根据CP437的160定义了160。ISO-8859-1在160到255之间重新定义字符。
编码GBK的多键字符
ASCII字符编码是单字节编码。进入中国后,计算机面临的一个问题是如何处理汉字。对于拉丁国家而言,通过扩展最高位,单个字节代表了所有角色的足够多,但是对于亚洲国家而言,一个字节似乎已经扩展了。因此,中国人制作了一组名为GB0的双字节字符,也称为GB0,1981,该角色是由中国国家标准管理局发布的。编码包含6763个汉字。同时,它也与ASCII和GB 2312的出现兼容,这些出现基本上满足了汉字的计算机处理需求。它包含的汉字覆盖了中国大陆使用频率的99.75%,但仍然无法满足中文字符的需求100%。无法处理一些稀有字符和传统汉字。后来,基于此创建了一个称为GBK的代码。 GBK不仅包括27,484个汉字,还包括藏族,蒙古人和等主要少数民族人物。同样,GBK也与ASCII编码兼容。它使用1个字节来表示英语字符和2个字节来识别汉字。
出现
GBK只能解决我们自己的问题,但是计算机不仅被美国人和中国人使用。也有来自世界上日本和韩国等其他欧洲和亚洲国家的文本,估计有数十万来自世界各地的文本,这超出了ASCII代码甚至GBK所代表的范围。尽管每个国家都可以制定自己的编码计划,但是当数据在不同国家传输时,将会出现各种乱码问题。如果您可以代表地球上的任何字符,甚至可以用一个字符编码的火星来解决问题,则该问题将得到解决。就是它,是,是,我们的小英雄,统一联盟的国际组织提出了代码,科学名称为“ -octet编码集”,缩写为UCS。它为世界上每个语言中的每个字符定义了独特的字符代码。该标准由十六进制数字表示,前缀U+前缀。例如,字母“ A”的编码是u+0041,汉字“ Zhong”的编码是u+4e2d。
有两种格式:UCS-2和UCS-4。 UCS-2用两个字节编码,共16位。从理论上讲,它最多可以代表65,536个字符。但是,世界上所有角色都显示65,536个数字远非观点。由于有将近100,000个汉字,因此.0规范定义了一组其他字符编码。 UCS-4使用4个字节(实际上只使用了31位,最高位必须为0)。从理论上讲,它可以完全涵盖语言中使用的所有符号。
限制
但是,存在某些局限性。当字符被传输或最终存储在网络上时,每个字符不一定需要两个字节。例如,字符“ a”,一个可以由一个字节表示的字符,但仍然需要使用两个字节,这显然是浪费空间的字符。
第二个问题是,当字符保存到计算机时,它是01个数字的字符串。那么,计算机如何知道2字节字符代表2字节字符?例如,字符“ han”的编码是u+6c49。我可以使用4个ASCII数字传输并保存此字符;我还可以使用由UTF-8编码的连续3个字节E6 B1 89来表示。关键是交流的双方都必须认识到它。因此,有不同的编码实现方法,例如:UTF-8,UTF-16等。就像英语一样,作为国家之间交流的标准,每个国家都有自己的语言。他们将标准英语文件转换为自己国家的文字。就像UTF-8一样,这就是实现它的方法。
具体实现:UTF-8
UTF-8()在上广泛使用。它是一个可变长度的字符编码,可以根据特定情况表示1-4字节中的字符。例如,英语字符,例如可以用ASCII代码表示的字符,当UTF-8表示与ASCII相同时,仅需要一个空间字节。对于多字节(n个字节),第一个字节的第一个n设置为1,n+1位将设置为0,下一个字节的前两个位设置为10。所有其余的二进制列列都填充了字符的代码。
以“良好”为例,“好”对应于597D,相应的间隔为0000 0800---0000 ffff,因此当UTF-8表示时,它需要存储在3个字节中。 597D由二进制:11101表示,填充为10,转换为十六进制,因此“良好”代码U+597D对应于UTF-8编码“”。您可以使用代码验证:
>>> a = u"好">>> au'\u597d'>>> b = a.encode('utf-8')>>> len(b)3>>> b'\xe5\xa5\xbd'
现在我终于完成了理论。让我们谈谈编码问题。出生时间比那早得多,默认编码是ASCII。因此,引起了许多编码问题。
>>> import sys>>> sys.getdefaultencoding()'ascii'
因此,在源代码文件中,必须指定编码类型的显示,否则代码中的任何中文都会报告语法错误。
# coding=utf-8或者是:# -*- coding: utf-8 -*-
字符类型
与中和字符串,STR和两种类型有关的数据类型有两种类型,这些类型是从继承而来的,Str类型的字符串的编码格式可以是ASCII,UTF-8,GBK,GBK,ETC。
对于汉字“良好”,当由str表示时,其相应的UTF-8编码为'\ xe5 \ xa5 \ xbd',相应的GBK编码为'\ xba \ xc3',当使用时,其相应的符号为u'\ u597d',它是等于u597d'的。
str的依
str和之间如何转换?这两种类型的字符串之间的转换取决于这两个功能。负责将代码编码到指定的字符中,以存储磁盘或传输到网络。该方法根据指定的编码方法解码并在应用程序中使用。
#从unicode转换到str用 encode>>> b = u'好'>>> c = b.encode('utf-8')>>> type(c)
'str'>>>> c'\xe5\xa5\xbd'#从str类型转换到unicode用decode>>> d = c.decode('utf-8')>>> type(d)
'unicode'>>>> du'\u597d'
错误原因
转换字符时,最常见的问题是错误。这些错误的根本原因是默认值是使用ASCII编码和操作,例如:
案例1
>>> s = '你好'>>> s.decode()
Traceback (most recent call last):
File "" , line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
当将s转换为字符串类型时,该方法默认使用ASCII编码进行解码,并且在ASCII字符集中没有汉语“ Hello”,因此出现。正确的方法是显示UTF-8字符编码。
>>> s.decode('utf-8')u'\u4f60\u597d'
同样,当将字符串转换为Str-Type字符串时,默认值是使用ASCII编码来编码转换。但是,在ASCII字符集中找不到中文字符“ Hello”,因此发生错误。
>>> a = u'你好'>>> a.encode()
Traceback (most recent call last):
File "" , line 1, in
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
案例2
当STR类型与类型类型混合时,类型str类型会隐式将str转换为字符串。如果str字符串是中文字符,则会发生错误,因为默认情况下将使用ASCII编码。
>>> s = '你好' # str类型>>> y = u'python' # unicode类型>>> s + y # 隐式转换,即 s.decode('ascii') + uTraceback (most recent call last):
File "" , line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)
正确的方法是显示用于解码的UTF-8字符。
>>> s.decode('utf-8') +y
u'\u4f60\u597dpython'
垃圾代码
乱码代码的所有原因都可以归因于字符在编码过程中使用不同编码后使用的不一致的编码格式,例如:
# encoding: utf-8>>> a='好'>>> a'\xe5\xa5\xbd'>>> b=a.decode("utf-8")>>> bu'\u597d'>>> c=b.encode("gbk")>>> c'\xba\xc3'>>> print c
��
UTF-8编码字符占用3个字节。解码后,如果您使用GBK进行解码,它将只有2个字节的长度,最后将出现乱码代码的问题。因此,防止乱码代码的最佳方法是始终坚持使用相同的编码格式来编码和解码字符。
(英国发音: /ˈpaɪθən /美国发音: /ˈpaɪθ别 /),是一种面向对象的解释的计算机编程语言,由荷兰Guido Van发明,1989年发行,首次公开发行于1991年。
它纯粹是免费的软件,源代码和解释器符合GPL()协议。语法简洁明了,其特征之一是迫使白空间缩进为语句。
有丰富而有力的图书馆。它通常被昵称为胶水语言,并且可以轻松地连接其他语言(尤其是C/C ++)的各种模块。一个常见的应用程序场景是使用程序的原型快速生成(有时甚至是程序的最终接口),然后以更合适的语言重写其中具有特殊要求的零件,例如3D游戏中的图形模块,这些模块具有特别高性能的要求,因此可以在C/C ++中重写,然后将其包含在c/c+中。应该注意的是,在使用扩展的类库时,您可能需要考虑平台问题,而有些则可能无法提供跨平台实现。
7月20日,IEEE发布了2017年编程语言排名:排名第一。
自1990年代初期该语言诞生以来,它逐渐被广泛用于处理系统管理任务和Web编程的处理。
创始人是Guido Van。 1989年圣诞节期间,吉多(Guido)决定制定一个新的脚本解释程序,以继承ABC语言,以使圣诞节的无聊。我之所以选择(的含义)作为编程语言的名称是因为他是一个名为Monty的喜剧团体的粉丝。
ABC是由Guido设计的教学语言。吉多(Guido)认为,ABC的语言非常美丽和强大,专为非专业程序员而设计。但是,ABC语言没有成功。吉多(Guido)认为它是由其不开放性引起的。 Guido决心避免此错误。同时,他还希望实施闪烁但尚未实现的东西。
这样,它出生于吉多手中。可以说,它是从ABC开发的,主要受-3的影响(另一种专为小组设计的相当美丽而有力的语言)。并结合了Unix Shell和C的习惯。
已成为最受欢迎的编程语言之一。 2011年1月,TIOBE编程语言排名将其评为2010年度语言。自2004年以来,使用率线性增加。
由于语言的简单性,可读性和可扩展性,用于国外科学计算的研究机构的数量正在增加,一些知名大学采用了编程课程。例如,卡内基·梅隆大学( )的编程基础知识以及麻省理工学院的计算机科学和编程简介是用语言教授的。许多开源科学计算机软件包都提供呼叫接口,例如著名的计算机视觉库,3D可视化库VTK和医疗图像处理库ITK。有更多专用的科学计算扩展库,例如以下三个经典的科学计算扩展库:Numpy,Scipy和,它们分别提供快速阵列处理,数值操作和绘图功能。因此,由语言及其众多扩展库组成的开发环境非常适合工程技术,科学研究人员处理实验数据,制作图表,甚至开发科学计算应用程序。
说到科学计算,将提到的第一件事是。但是,除了无法替换的一些高度专业的工具箱外,大多数常用的功能都可以在世界范围内找到。与使用科学计算的以下优势相比:
首先,它是一种商业软件,它很昂贵。它是完全免费的,许多开源科学计算库都提供呼叫接口。用户可以在任何计算机上免费安装其大部分扩展库。
其次,这是一种更容易访问和严格的编程语言。它允许用户编写更多可读和可维护的代码。
最后,主要关注工程和科学计算。但是,即使在计算领域,我们也经常遇到各种需求,例如文件管理,接口设计和网络通信。借助丰富的扩展库,它可以轻松完成各种高级任务,并且开发人员可以使用实现完整应用程序所需的各种功能。
提醒:请联系我时一定说明是从星空网上看到的!