引用: http://blog.csdn.net/lxdcyh/archive/2009/03/23/4018054.aspx
为什么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的编码形式
原理说了半天,最后来个包治百病的吧:)
view plaincopy to clipboardprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
#!/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')
分享到:
相关推荐
Python 字符串的 encode 与 decode 研究 Python 中的字符串编码问题是非常常见的,很多开发者在处理字符串时会遇到乱码问题。这个问题的根源是 Python 字符串的内部表示是 Unicode 编码,而在编码转换时需要以 ...
`Encode_ Decode Tools`是一款用于URL编码和解码的工具,它可以帮助开发者和用户方便地处理这些编码问题。这款工具可能提供了简单的用户界面,允许用户输入URL或字符串,然后点击按钮进行编码或解码操作。它支持对...
由于Python3默认采用Unicode作为其内部字符串编码方式,因此在处理不同编码格式(如UTF-8、GBK等)的数据时,我们需要通过`encode()`和`decode()`方法来实现字符串与字节码之间的转换。本文将详细介绍这两个方法的...
decode和encode是他们之间的转化函数 大致的过程如下 decode encode str --> str(Unicode) --> str decode()方法语法: str.decode(encoding=‘UTF-8’,errors=‘strict’) 参数: encoding – 要使用的编码...
在压缩包内的"LDPC_encode_decode_minsum_sim"文件,很可能是MATLAB、Python或其他编程语言编写的源代码,用于实现LDPC编码和基于MinSum的解码过程。这些代码可能包括以下几个部分: 1. **编码模块**:这部分代码会...
在这个“lzw_encode_decode.zip”压缩包中,包含了关于LZW压缩和解压缩的相关文件,对于学习这个算法的初学者来说非常有价值。 LZW算法的核心思想是通过构建一个动态的编码表,将输入数据中的重复模式进行编码,以...
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 decode的作用是将...
这个模块提供了多个函数,包括`b64encode()`和`b64decode()`,分别用于编码和解码Base64数据。 1. **Base64编码**: 使用`b64encode()`函数,你可以将任何二进制数据(如字节串)转换成Base64编码的字符串。例如:...
总结,Python中处理乱码问题的核心是理解字符串的编码与解码过程,并通过`decode`和`encode`方法进行转换。在实际应用中,要确保正确识别和处理目标网页的编码格式,以避免乱码现象。在遇到编码问题时,学会使用上述...
在Python编程中,编码和解码是处理字符串和文本文件时必须面对的重要概念,尤其是在处理中文字符时。这里我们将深入探讨Python2中的编码问题,以及如何解决常见的五个问题。 1. **默认编码**: Python2默认使用ASCII...
在Python环境中,XED库允许程序员利用其丰富的功能,通过Python脚本进行X86指令的编码和解码操作。这为那些需要在Python中处理底层硬件指令的项目提供了便利。Python的可移植性和易用性与XED的强大功能相结合,使得...
本文将详细探讨一个名为"encode-decode-tools"的Python工具集,它提供了一种用户友好的方式,通过菜单和帮助功能来执行各种编码和解码操作。 编码是将原始数据转换为不可读的形式,以保护信息不被未经授权的个人...
将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以“翻译”所以格式编码的格式。Python3中str和bytes是两种格式...
4. 使用示例:在Python代码中,你可以导入smsutil模块,然后调用它的方法,如`smsutil.decode()`用于解码接收到的编码短信,`smsutil.encode()`用于编码要发送的短信,以及`smsutil.concat_sms()`用于组合短信片段。...
首先,我们要了解Python中进行Base64编码和解码的基本操作。在Python标准库中,`base64`模块提供了相关的函数。`base64.b64encode()`用于编码,`base64.b64decode()`用于解码。 以下是一个简单的Base64编码示例: `...
在Python中,编码和解码涉及到Unicode、ASCII、GBK、UTF-8等不同的字符编码标准。 一、字符编码历史与发展 1. ASCII编码:最早期的字符编码,使用7位二进制,可表示128个字符,主要针对英文字符。 2. Unicode编码...
综上所述,"Base64_encode_decode"开源项目提供了对Base64编码和解码的功能,对于开发者来说,这是一个方便的工具,可以轻松处理Base64数据,尤其在开发网络应用或处理跨平台数据交换时。通过阅读和理解这个项目的源...
对于Python开发者来说,理解编码和解码的概念至关重要,特别是在处理国际化和本地化数据时。了解如何在Python中正确地设置和处理编码,可以避免许多常见的字符乱码问题。通过学习Python的`str`、`unicode`、`encode`...