博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 中文编码问题
阅读量:5902 次
发布时间:2019-06-19

本文共 2048 字,大约阅读时间需要 6 分钟。

一、str对象

a='\xe5\x93\x88\xe5\x93\x88' #字节串本身编码形式

a='哈哈'# 脚本环境编码形式
a='\u54c8\u54c8'# unicode_escape编码形式

str记录的是字节数组(某种编码的存储格式),至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。

print语句将要输出的内容传给操作系统,操作系统根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为'\xe5\x93\x88\xe5\x93\x88'用GBK去解释,其显示的出来就是“鍝堝搱”。

 

二、unicode对象

a=u'\u54c8\u54c8'

a=u'啊'
a=u'\xb0\xa1'

当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测)

 

三、str和unicode对象的转换

str--->unicode
str.decode('utf-8')

unicode--->str

unicode.encode('utf-8')

在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。

1. 对于控制台操作,只需要依次执行一下代码即可:
import sys
reload(sys)
sys.setdefaultencoding('gbk')
2. 对于脚本文件,可以在文件头书写特定编码:
# coding = gbk
# -*- coding: gbk -*-
也可以在Configure IDLE中设置Default Source Encoding默认编码
当脚本中存在编码声明时,文件保存格式编码(Default Source Encoding)失效;否则,反之。

 

实例1 '\xe5\x93\x88\xe5\x93\x88'形式(UTF-8编码)显示中文

a='\xe5\x93\x88\xe5\x93\x88'# utf-8编码形式

print(a.decode('utf-8'))

这里直接使用print(a)会调用系统默认编码(GBK)对输入的字节流进行编码,而这里的a是UTF-8编码的,所以会报错;而如果a是系统编码(GB2312或GBK)的形式,如:

a='\xb9\xfe\xb9\xfe'# GB2312或GBK编码形式
print(a)

直接使用print(a)就没问题了

如果操作文件或网页打印出来的是这种形式的,使用其编码解码就是了

 

实例2 '哈哈'形式显示中文

a='哈哈'

IDLE中:print(a)
脚本中:print(a.decode('utf-8'))# utf-8脚本编码

这里会调用脚本或IDLE默认编码对其编码、解码。

如果脚本编码为GBK或GB2312则可以直接使用:
print(a)

实例3 '\u54c8\u54c8'形式显示中文

a='\u54c8\u54c8'

print(a.decode('unicode_escape'))

这里a是str字节串,只是其中包含unicode码,使用unicode_escape解码就是了

 

实例4 u'\u54c8\u54c8'

a=u'\u54c8\u54c8'

print(a)

直接使用print(a)

 

实例5 u'\xe5\x93\x88\xe5\x93\x88'形式

a=u'\xe5\x93\x88\xe5\x93\x88'# utf-8编码

print(a.encode('raw_unicode_escape').decode('utf-8'))

其实,a.encode('raw_unicode_escape')将其转换为'\xe5\x93\x88\xe5\x93\x88',同实例1:
这里直接使用print('\xe5\x93\x88\xe5\x93\x88')会调用系统默认编码(GBK)对输入的字节流进行编码,而如果a是GB2312或GBK编码的,直接print即可。如:

c=u'\xb9\xfe\xb9\xfe'# gbk编码形式

print(c.encode('raw_unicode_escape'))

 

实例6 u'哈哈'形式

a=u'哈哈'

IDLE中:print(a.encode('raw_unicode_escape'))
脚本中:print(a)

存储形式为u'\u554a'(脚本:参照实例4)或u'\xb0\xa1'(IDLE:参照实例5)。

 

 

 

转载于:https://www.cnblogs.com/doudongchun/p/3693784.html

你可能感兴趣的文章
csharp skype send message in winform
查看>>
MMORPG 游戏服务器端设计--转载
查看>>
HDFS dfsclient写文件过程 源码分析
查看>>
ubuntu下安装libxml2
查看>>
nginx_lua_waf安装测试
查看>>
WinForm窗体缩放动画
查看>>
JQuery入门(2)
查看>>
linux文件描述符
查看>>
传值引用和调用引用的区别
查看>>
hyper-v 无线网连接
查看>>
Python3.7.1学习(六)RabbitMQ在Windows环境下的安装
查看>>
Windows下memcached的安装配置
查看>>
ubuntu: firefox+flashplay
查看>>
web.xml 中CharacterEncodingFilter类的学习
查看>>
贪吃蛇逻辑代码
查看>>
实现c协程
查看>>
ASP.NET视频教程 手把手教你做企业论坛网站 视频教程
查看>>
[LeetCode] Meeting Rooms II
查看>>
从Swift学习iOS开发的路线指引
查看>>
Scribes:小型文本编辑器,支持远程编辑
查看>>