python中的编码问题(decode,encode,codecs)

编码方式:一个字节包括八个比特位,每个比特位表示0或1,一个ASCII编码使用一个字节(如10101000),因此ASCII编码方式只能表示 2 7 = 128 ( 除 去 字 节 的 最 高 位 作 为 作 奇 偶 校 验 位 ) 2^7=128(除去字节的最高位作为作奇偶校验位) 27=128()。这样表示字符有限,像汉字字符就没法表示了,因此又出现了出现了Unicode编码。Unicode编码通常由两个字节组成,共表示 256 ∗ 256 256*256 256256个字符,即所谓的UCS-2。某些偏僻字还会用到四个字节,即所谓的UCS-4。但是这样很浪费内存空间,因此又出现可变长的编码方式UTF-8编码。UTF-8可以表示,从英文字母的一个字节,到中文的通常的三个字节,再到某些生僻字的六个字节,也兼容ASCII编码。我国有一套自己编码方式:GB2312和GBK。

1.encode与decode

在Python3.X 源码文件中默认使用utf-8编码,所以可以正常解析中文,无需指定 UTF-8 编码。:

import sys
print(sys.getdefaultencoding())

输出:

utf-8

我们可以直接调用decode,ecode来实现编码和解码,encode的作用,使我们看到的直观的字符转换成计算机内的字节形式,decode刚好相反,把字节形式的字符转换成我们看的懂的、直观的、“人模人样”的形式,比如:

a="中文"
a = bytes(a,encoding='utf-8')
print(type(a),a,len(a))
mid=a.decode()
print(type(mid),mid,len(mid))

输出:

<class 'str'> 中文 2
<class 'bytes'> b'\xe4\xb8\xad\xe6\x96\x87' 6
<class 'str'> 中文 2

此处先通过bytes(a,encoding=‘utf-8’)先转化为utf-8编码的字节流,然后可以直接通过decode()转化为正常可见字符串,默认的decode是utf-8的,若是其他编码方式,要把此参数填写上。比如:

a="中文"
a=bytes(c,encoding='gb2312')
print(type(a),a,len(a))
mid=a.decode()
print(type(mid),mid,len(mid))

输出:

<class 'str'> 中文 2
<class 'bytes'> b'\xd6\xd0\xce\xc4' 4
<class 'str'> 中文 2

据说字符在计算机的内存中统一是以Unicode编码的。只有在字符要被写进文件、存进硬盘或者从服务器发送至客户端(例如网页前端的代码)时会变成utf-8。unicode-escape将Unicode的内存编码值进行存储,读取文件时在反向转换回来。这里我们可以是使用encode(‘unicode-escape’)将字符以Unicode的字节形式表现出来:

a="中文"
print(type(a),a,len(a))
a = bytes(a,encoding='unicode_escape')
print(type(a),a,len(a))
mid=a.decode("unicode_escape")
print(type(mid),mid,len(mid))

输出:

<class 'str'> 中文 2
<class 'bytes'> b'\\u4e2d\\u6587' 12
<class 'str'> 中文 2

2.codecs

codecs是专门用作编码转换
解码:

import codecs
look2=codecs.lookup("gb2312")
c="中文"
mid=look2.encode(c)
print(type(mid),mid,len(mid))
mid=look2.decode(mid[0])
print(type(mid),mid,len(mid))

输出:

<class 'tuple'> (b'\xd6\xd0\xce\xc4', 2) 2
<class 'tuple'> ('中文', 4) 2

看输出,codecs的encode和decode输出的是tuple,第一位是值,第二位是长度。

参考 https://www.jb51.net/article/92006.htm

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,字符串是以Unicode编码方式存储的,可以表示任意字符,包括文字符。Unicode是一个国际标准,为每个字符分配一个唯一的数字码点,支持世界上所有的字符集,包括文、日文、韩文等。为了在Python正确处理编码,可以使用字符串的encode()和decode()方法。str.encode(encoding="utf-8")可以将字符串按照指定的编码方式编码成二进制数据,而bytes.decode(encoding="utf-8")则可以将二进制数据按照指定的编码方式解码成字符串。此外,Python还提供了一些与字符编码相关的函数和模块,例如chardet模块可以自动检测文本文件的编码方式,而codecs模块提供了一些通用的编码和解码方法。当读写编码的文本文件时,在打开文件时需要指定正确的编码方式,以防止读取文件内容出现乱码。通过在打开文件时使用encoding参数,可以指定文件的编码方式。例如,在使用with语句读取UTF-8编码的文本文件时,可以使用以下代码:with open("test.txt", encoding="utf-8") as f: text = f.read() print(text) [1][2][3123 #### 引用[.reference_title] - *1* *2* *3* [python入门必备:深入了解Python 编码](https://blog.csdn.net/weixin_43170061/article/details/130254082)[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^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值