`

python encode和decode 编码研究

阅读更多

引用: 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研究.pdf

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

    Python3字符串encode与decode的讲解

    由于Python3默认采用Unicode作为其内部字符串编码方式,因此在处理不同编码格式(如UTF-8、GBK等)的数据时,我们需要通过`encode()`和`decode()`方法来实现字符串与字节码之间的转换。本文将详细介绍这两个方法的...

    Encode_ Decode Tools URL编码解码工具

    `Encode_ Decode Tools`是一款用于URL编码和解码的工具,它可以帮助开发者和用户方便地处理这些编码问题。这款工具可能提供了简单的用户界面,允许用户输入URL或字符串,然后点击按钮进行编码或解码操作。它支持对...

    python decode()和encode()函数详解

    decode和encode是他们之间的转化函数 大致的过程如下 decode encode str --> str(Unicode) --> str decode()方法语法: str.decode(encoding=‘UTF-8’,errors=‘strict’) 参数: encoding – 要使用的编码...

    LDPC_encode_decode_minsum_sim.rar_MinSum译码算法_ldpc decode_ldpc译码_

    在压缩包内的"LDPC_encode_decode_minsum_sim"文件,很可能是MATLAB、Python或其他编程语言编写的源代码,用于实现LDPC编码和基于MinSum的解码过程。这些代码可能包括以下几个部分: 1. **编码模块**:这部分代码会...

    lzw_encode_decode.zip_LZW文件压缩_lzw_lzw压缩

    在这个“lzw_encode_decode.zip”压缩包中,包含了关于LZW压缩和解压缩的相关文件,对于学习这个算法的初学者来说非常有价值。 LZW算法的核心思想是通过构建一个动态的编码表,将输入数据中的重复模式进行编码,以...

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

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

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

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

    python2 编码问题的测试代码

    在Python编程中,编码和解码是处理字符串和文本文件时必须面对的重要概念,尤其是在处理中文字符时。这里我们将深入探讨Python2中的编码问题,以及如何解决常见的五个问题。 1. **默认编码**: Python2默认使用ASCII...

    Python-英特尔X86编码器解码器英特尔XED

    在Python环境中,XED库允许程序员利用其丰富的功能,通过Python脚本进行X86指令的编码和解码操作。这为那些需要在Python中处理底层硬件指令的项目提供了便利。Python的可移植性和易用性与XED的强大功能相结合,使得...

    base64-编码解码工具-python实现源码

    这个模块提供了多个函数,包括`b64encode()`和`b64decode()`,分别用于编码和解码Base64数据。 1. **Base64编码**: 使用`b64encode()`函数,你可以将任何二进制数据(如字节串)转换成Base64编码的字符串。例如:...

    encode-decode-tools:一套自定义工具,用于通过菜单和帮助进行编码和解码

    本文将详细探讨一个名为"encode-decode-tools"的Python工具集,它提供了一种用户友好的方式,通过菜单和帮助功能来执行各种编码和解码操作。 编码是将原始数据转换为不可读的形式,以保护信息不被未经授权的个人...

    详谈Python高阶函数与函数装饰器(推荐)

    将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以“翻译”所以格式编码的格式。Python3中str和bytes是两种格式...

    Python-smsutil用于编码解码和分解SMS短信的Python工具类

    4. 使用示例:在Python代码中,你可以导入smsutil模块,然后调用它的方法,如`smsutil.decode()`用于解码接收到的编码短信,`smsutil.encode()`用于编码要发送的短信,以及`smsutil.concat_sms()`用于组合短信片段。...

    Python实现base64编码的图片保存到本地功能示例

    首先,我们要了解Python中进行Base64编码和解码的基本操作。在Python标准库中,`base64`模块提供了相关的函数。`base64.b64encode()`用于编码,`base64.b64decode()`用于解码。 以下是一个简单的Base64编码示例: `...

    20180530_Python编码及中文乱码1

    在Python中,编码和解码涉及到Unicode、ASCII、GBK、UTF-8等不同的字符编码标准。 一、字符编码历史与发展 1. ASCII编码:最早期的字符编码,使用7位二进制,可表示128个字符,主要针对英文字符。 2. Unicode编码...

    Base64_encode_decode-开源

    综上所述,"Base64_encode_decode"开源项目提供了对Base64编码和解码的功能,对于开发者来说,这是一个方便的工具,可以轻松处理Base64数据,尤其在开发网络应用或处理跨平台数据交换时。通过阅读和理解这个项目的源...

    Python设置默认编码为utf8的方法

    对于Python开发者来说,理解编码和解码的概念至关重要,特别是在处理国际化和本地化数据时。了解如何在Python中正确地设置和处理编码,可以避免许多常见的字符乱码问题。通过学习Python的`str`、`unicode`、`encode`...

Global site tag (gtag.js) - Google Analytics