Python字符编码的几个问题

几种字符编码方式

ASCII——ASCII 码使用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。标准ASCII 码也叫基础ASCII码,使用7 位二进制数(剩下的1位二进制为0)来表示所有的大写和小写字母,数字0 到9、标点符号, 以及在美式英语中使用的特殊控制字符。

Unicode——ASCII码最多只能处理256个字符,这对英文是够用了,但是对于其他语言就不够了,比如中文,汉字多大10万左右,就无法用ASCII来表示了。Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF,每组称为平面(Plane),而每平面拥有65536个码位,共1114112个。

UTF8——随着互联网的发展,同时又为了减少存储空间,UTF-8就成了在互联网上使用最广的一种Unicode的实现方式。**注意,UTF-8是Unicode的实现方式之一,还有UTF-16,UTF-32。**UTF-8描述了字符在计算机内的具体存储方式。具体实现规则可以在网上查。

Python字符

python 3中,字符默认采用Unicode编码,str函数获得的字符串都是Unicode编码字符。将字符转换成另一种二进制存储方式,称之为编码,可以采用encode()函数,反过来则为解码,采用decode()函数。

>>> s = 'café'
>>> len(s)
4
>>> b = s.encode('utf-8')
>>> len(b)
5
>>> b
b'caf\xc3\xa9'
>>> b.decode('utf-8')
'café'
>>> 

上面的例子中,s有4个Unicode字符,b就是s采用utf-8编码后的字节码,它包含5个字节,其中é编码成了两个字节。同时将这些字节码用utf-8编码方式解码后得到了原来的字符串。

常见的encode和decode问题

UnicodeEncodeError

许多非UTF字符编码器仅仅只包含了Unicode字符的一个子集,当将文本转换成字节码时,如果遇到了一个字符没有定义在这个子集中,就会出现UnicodeEncodeError错误。举例如下:

>>> city = 'São Paulo'
>>> city.encode('utf-8')
b'S\xc3\xa3o Paulo'
>>> city.encode('utf-16')
b'\xff\xfeS\x00\xe3\x00o\x00 \x00P\x00a\x00u\x00l\x00o\x00'
>>> city.encode('cp437')
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
city.encode('cp437')
  File "C:\Python34\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character '\xe3' in position 1: character maps to <undefined>

如果不想让它抛出异常,可以如下处理:

>>> city.encode('cp437', errors='ignore')
b'So Paulo'
>>> city.encode('cp437', errors='replace')
b'S?o Paulo'
>>> city.encode('cp437', errors='xmlcharrefreplace')
b'S&#227;o Paulo'

其中ignore调过不能处理的字符,replace用‘?’替代不能处理的字符,xmlcharrefreplace则用XML实例替换不能处理的字符。

UnicodeDecodeError

由于不是每一个字节序列都代表了一个有效的UTF-8或者UTF-16字符编码,因此当从一个二进制序列解码到文本时,可能就会产生UnicodeDecodeError异常。像 ‘cp1252’, ‘iso8859_1’, ‘koi8_r’能够解码任何字节序列,包括噪声在内,即便是错误的编码,它们也不会报异常。

octets = b'Montr\xe9al'
>>> octets.decode('cp1252')
'Montréal'
>>> octets.decode('iso8859_7')
'Montrιal'
>>> octets.decode('koi8_r')
'MontrИal'
>>> octets.decode('utf_8')
Traceback (most recent call last):
  File "<pyshell#47>", line 1, in <module>
octets.decode('utf_8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 in position 5: invalid continuation byte
>>> octets.decode('utf_8', errors='replace')
'Montr�al'

SyntaxError

python 3中源码默认的编码方式为UTF-8编码,如果一个源码文件不是以UTF-8编码的,那么在加载的时候,可能就会报SyntaxError。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,字符串是由一系列字节组成的字节数组。当显示字符串时,需要将其解码为特定的字符编码才能正确显示。乱码通常是由于使用错误的字符编码或者编码转换异常引起的。 乱码的情况一般发生在以下两种情况下: 1. 字符编码不一致:当字符串的编码与控制台或其他输出设备的编码不一致时,会导致乱码。比如将使用GBK编码字符串输出到UTF-8编码的控制台,或者将使用UTF-8编码字符串输出到GBK编码的控制台都会导致乱码。 2. 编码转换异常:在进行字符编码转换时,如果源字符串的编码格式不符合目标编码的要求,就会抛出编码转换异常,从而导致乱码的出现。 为了避免乱码问题,在处理字符串时,我们可以采取以下几个方法: 1. 确保输入和输出的设备使用相同的字符编码。比如,如果你的字符串使用GBK编码,那么你应该将控制台或其他输出设备的编码设置为GBK。 2. 在进行字符编码转换时,使用正确的源编码和目标编码。可以使用Python的内置函数encode()和decode()来进行编码转换。 3. 使用Unicode字符串来避免编码问题。Unicode字符串是一种特殊的字符串类型,它可以包含任何字符,而不会出现编码问题。 总之,乱码问题Python中是一个常见的问题,但通过正确的字符编码设置和编码转换方法,可以有效地解决乱码问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Python】中文乱码问题与解决方案 深入分析](https://blog.csdn.net/Xuange_Aha/article/details/130441906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值