Python中的Unicode编码和UTF-8编码

本文深入探讨了ASCII、Unicode和UTF-8编码的区别及应用。解释了Unicode如何解决多语言编码问题,以及UTF-8如何在保持兼容性的同时提高存储效率。通过实际案例,如Python编程中的字符串处理,展示了不同编码在实际操作中的转换过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编码是最最基础的内容,但是也是比较容易忽视的一环

转自:https://www.cnblogs.com/cnhkzyy/p/7359205.html

 

下午看廖雪峰的Python2.7教程,看到 字符串和编码 一节,有一点感受,结合 崔庆才的Python博客 ,把这种感受记录下来:

 

ASCII码:是用一个字节(8bit, 0-255)中的127个字母表示大小写字母,数字和一些符号.主要用来表示现代英语和西欧语言。

所以处理中文就出现问题了,因为中文处理至少需要两个字节,所以中国制定了GB2312。

所以,各国制定了各国的标准。日本制定了Shift_JIS,韩国制定了Euc-kr。。。那么,乱码就来了。

 

为了统一,Unicode诞生了。统一码把所有语言都统一到一套编码里。解决了乱码问题,但是存储和传输效率低下的问题又来了。

因为ASCII编码是1个字节,而Unicode编码通常是2个字节。你表示一个英文字母一个字节就够了,但是Unicode却不得不用两个字节来表示(另一个字节补0)。

 

为了节约,出现了把Unicode编码转化为“可变长编码”的UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节。如果你要传输的文本包含大量英文字符,用UTF-8编码就能节省空间(ASCII码可以看成是UTF-8的一部分,所以大量只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续工作)。

 

现在如果我要用Notepad编辑一个python的脚本,我打开文件的过程中,内存中就开辟了一段空间,来临时存储我保存的代码,在计算机内存中,统一使用Unicode编码。

所以我写的中文字符串,要在前面加u表示是Unicode编码的字符串。

静觅博客中也是:

但是为什么有时候,我们要用到decode('utf-8'),再结合静觅博客来看:

因为糗事百科的服务器发送给客户端(也就是浏览器)的响应的编码就是‘UTF-8':

为了在文本编辑(读取文本)时,内存中需要Unicode编码,所以用decode('utf-8')解码,把UTF-8转化为Unicode编码(同理,encode('utf-8')是把Unicode转化为UTF-8编码)。

当保存文本到保存到硬盘或者需要传输的时候,就转换为UTF-8编码,所以我们需要在python脚本开头定义#-*-coding:utf-8-*-

 

 图片来源

廖雪峰的官方网站:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819196283586a37629844456ca7e5a7faa9b94ee8000

静觅 崔庆才的个人博客:http://cuiqingcai.com/990.html

### Unicode 编码转换为 UTF-8 的方法 在 Python 中,可以通过 `encode` `decode` 方法来完成 UnicodeUTF-8 的相互转换。以下是详细的说明以及代码示例。 #### 使用 encode 方法将 Unicode 转换为 UTF-8 字节流 当需要将一个 Unicode 字符串转换成字节形式时,可以调用字符串对象的 `.encode()` 方法,并指定目标编码格式为 `'utf-8'`[^2]。此操作会返回该字符串对应的字节数组表示。 ```python text = "你好,世界!" byte_data = text.encode('utf-8') print(f"Byte data: {byte_data}") # 输出 b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8c\xe4\xb8\x96\xe7\x95\x8c\xef\xbc\x81' ``` #### 使用 decode 方法将 UTF-8 字节流转回 Unicode 字符串 如果有一个以 UTF-8 形式的字节数组,则可通过 `.decode('utf-8')` 来将其解码还原成为原始的 Unicode 文本。 ```python decoded_text = byte_data.decode('utf-8') print(f"Decoded Text: {decoded_text}") # 输出 '你好,世界!' ``` #### 文件读写的例子 对于实际应用中的文件存储场景,也可以利用内置函数轻松实现数据持久化与恢复过程: ```python # 写入UTF-8编码的数据至文件 with open('output.txt', 'w', encoding='utf-8') as writer: writer.write(text) # 从文件中读取并验证内容一致性 with open('output.txt', 'r', encoding='utf-8') as reader: loaded_content = reader.read() assert loaded_content == text, "Data mismatch!" ``` 另外,在涉及 JSON 序列化的场合下,为了保持非 ASCII 字符不被转义,推荐设置参数 `ensure_ascii=False`[^3]^: ```python import json data = {"message": "你好"} json_str = json.dumps(data, ensure_ascii=False) print(json_str) # '{"message": "你好"}' ``` 以上即是在 Python 环境里处理 UnicodeUTF-8 及反向流程的具体方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值