`
moonlitsky
  • 浏览: 10856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Python字符串的encode与decode研究心得——解决乱码问题(转)

阅读更多

为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8 \xad\xe6\x96\x87”的形式?为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码
代码中字符串的默认编码与代码文件本身的编码一致。
如:s='中文'
如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需 要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默 认编码创建的代码文件。
如果字符串是这样定义:s=u'中文'
则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。
如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:
isinstance(s, unicode)  #用来判断是否为unicode
用非unicode编码形式的str来encode会报错
如何获得系统的默认编码?


#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding() 


该段程序在英文WindowsXP上输出为:ascii
在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。
如在UliPad中运行如下代码:


s=u"中文"
print s


会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。
将最后一句改为:print s.encode('gb2312')
则能正确输出“中文”两个字。
若最后一句改为:print s.encode('utf8')
则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。
unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码
使用str.__class__可以查看str的编码形式
原理说了半天,最后来个包治百病的吧:)


#!/usr/bin/env python 
#coding=utf-8 
s="中文" 
 
if isinstance(s, unicode): 
#s=u"中文" 
    print s.encode('gb2312') 
else: 
#s="中文" 
print s.decode('utf-8').encode('gb2312') 

ps:或者更简单的,让你的文件编码设置为utf-8,然后使用如下:


#coding:utf-8
s = "中文"
str = unicode(s, 'utf-8')
print str

 

分享到:
评论

相关推荐

    Python字符串的encode与decode研究.pdf

    Python 字符串的 encode 与 decode 研究 Python 中的字符串编码问题是非常常见的,很多开发者在处理字符串时会遇到乱码问题。这个问题的根源是 Python 字符串的内部表示是 Unicode 编码,而在编码转换时需要以 ...

    Python字符串的encode与decode研究心得乱码问题解决方法

    字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。  decode的作用是将...

    Python3字符串encode与decode的讲解

    ### Python3字符串encode与decode详解 #### 一、引言 在Python3中,字符串处理是非常常见且重要的操作之一。由于Python3默认采用Unicode作为其内部字符串编码方式,因此在处理不同编码格式(如UTF-8、GBK等)的...

    详解Python解决抓取内容乱码问题(decode和encode解码)

    总结,Python中处理乱码问题的核心是理解字符串的编码与解码过程,并通过`decode`和`encode`方法进行转换。在实际应用中,要确保正确识别和处理目标网页的编码格式,以避免乱码现象。在遇到编码问题时,学会使用上述...

    python避免中文乱码的代码.docx

    3. **使用`encode`和`decode`方法**:如果已经有一个包含中文字符的普通字符串,我们可以使用`encode`方法将其转换为字节流(UTF-8编码),然后再使用`decode`方法将字节流转换回Unicode字符串。例如: ```python ...

    python 中文乱码 问题深入分析.docx

    Python 中文乱码问题深入分析 在 Python 中,中文乱码问题一直是一个让人头疼的问题,经常抛...Python 中的中文乱码问题可以通过正确地使用 encode 和 decode 函数,设定默认编码,和正确地读取文件的编码格式来解决。

    Python 字符串前面加u,r,b的含义

    使用`u`前缀可以确保字符串以Unicode形式存储,避免因编码问题导致的乱码。例如: ```python u"我是含有中文字符组成的字符串。" ``` 2. **r 前缀**:`r`前缀表示的是原始字符串(raw string)。在原始字符串中...

    python 文件读写 乱码

    其中,`decode`方法用于将指定编码的字符串转换为Unicode格式,而`encode`方法则用于将Unicode字符串转换为指定编码的字符串。 #### 三、文件读写操作 ##### 3.1 基础文件读写 对于简单的文本文件读写,可以使用...

    Python2与Python3关于字符串编码处理的差别总结

    在Python2中,当你尝试打印一个字节字符串时,Python会尝试使用系统默认的编码进行解码,如果该编码与字节字符串的实际编码不匹配,就可能出现乱码。而在Python3中,print语句会自动处理字符串的编码和解码,确保...

    Python字符编码转码之GBK,UTF8互转

    Python字符编码转换是编程过程中经常会遇到的问题,尤其是在处理多语言数据或者与不同系统交互时。本文将详细讨论Python中GBK和UTF-8两种编码格式之间的转换,并解释它们各自的特点。 首先,了解Python中的字符编码...

    Python字符编码_中文乱码.pdf

    ### Python字符编码与中文乱码问题详解 #### 一、引言 在处理中文文本时,经常遇到的一个问题是中文乱码。特别是在使用Python进行开发时,由于不同的操作系统默认编码方式不同,以及Python自身对源文件编码的处理...

    Python网络爬虫出现乱码问题的解决方法

    Python网络爬虫在抓取网页数据时,可能会遇到各种乱码问题,这通常是由于源网页的编码与程序处理编码不一致导致的。解决这类问题的关键在于正确地识别和转换编码。 首先,我们要理解网页编码的基本原理。网页的编码...

    20180530_Python编码及中文乱码1

    在Python2中,有str和unicode两种字符串类型,str用于存储8位字节,而unicode用于存储Unicode编码。Python3中则统一为str,代表Unicode字符串,而bytes用于存储字节序列。 转换关系如下: - Python2: str -> decode...

    字符串按照指定的字节数来截取

    如果要考虑字节,我们需要使用`encode()`方法将字符串转化为字节串,因为Python的切片默认是基于字符的。例如: ```python s = "你好,世界" byte_s = s.encode('utf-8') # 将字符串转为UTF-8编码的字节串 ...

    Python中文乱码

    6. **字符串编码与解码**:在Python中,可以使用`str.encode()`和`str.decode()`方法对字符串进行编码和解码。例如,将UTF-8编码的字符串转为GBK: ```python utf8_str = '你好' gbk_bytes = utf8_str.encode('...

    字符串处理-验证用户输入的数据-Python实例源码.zip

    8. **编码与解码**:处理不同编码的字符串时,要使用`encode()`和`decode()`方法,理解Unicode和ASCII等编码体系,避免乱码问题。 9. **字符串比较**:Python中的字符串比较是基于字典序的,理解这一点对于排序、...

    python2 编码问题的测试代码

    3. **编码与解码**: 在Python中,将非Unicode字符串转换为Unicode字符串的过程称为解码(decode),反之则称为编码(encode)。例如,你需要使用`str.decode('编码格式')`来解码字节字符串,使用`unicode.encode('...

    Python中文字符串截取问题

    总之,处理Python中的UTF-8中文字符串截取时,关键在于理解UTF-8编码的特点和Python字符串的操作方式。通过遵循上述原则,我们可以避免因错误操作导致的乱码问题,确保程序的正常运行和数据的准确展示。在开发过程中...

Global site tag (gtag.js) - Google Analytics