最新消息:

Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str

python admin 4647浏览 0评论

1. Python的两种版本,Python 2.x和Python 3.x,的划分,不了解的去参考:
【整理】总结Python2(Python 2.x版本)和Python3(Python 3.x版本)之间的区别

2.对于各种字符编码要有个基本的了解比如:

通用的Unicode  Unicode的最常见的一种实现方式,UTF-8Windows中的默认编码GBK等等,有个基本的概念。如果不了解,可以参考相关内容

字符编码详解

Windows Cmd中:设置字符编码:简体中文GBK/英文

3.关于Python文件中,声明当前文件所使用何种编码,要清楚其含义

不了解的,去看:

【整理】关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型

Python编解码简介 Python中,不论是Python 2.x还是Python 3.x中,总体上说,字符都只有2大类:

一类是通用的Unicode字符;

另一类是,(unicode被编码后的),某种编码类型的字符,比如UTF-8,GBK等等类型的字符;但是呢:Python 2.x,字符编码方面,设计的不好,导致经常,非常容易,出现一些字符编码解码方面的错误。

具体常见错误及解决办法,可参考:

【总结】Python中常见字符编码和解码方面的错误及其解决办法

而:

Python 3.x中,对于字符编解码方面的设计,的确先进和简洁多了,在使用过程中,也就很少再出现这类编码解码方面的错误了。

下面,就来对比一下:

1.下面是上面相关的字符串转换,所用的示例代码。

如下代码,分别在:

Python 2.7.2

Python 3.2.2

中测试通过。

2. 你可以把如下对应的代码,保存为对应的文件。

其中,需要注意对应的Python文件所使用的编码,需要和其声明的编码(UTF-8)一致。

换句话说,你要把代码保存到UTF-8编码的Python文件中。

 

其中:

对于如何确保文件本身是何种编码的,以及如何转换为所需的编码类型,不了解的,可以参考:

用Notepad++实现不同字符编码之间的转换

3.如果你实在对编码不熟悉,那么直接下载对应的文件吧(右击另存为):

脚本下载 python

python_2.x_unicode_to_str.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str
 
http://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python2xUnicodeToStr():
    zhcnUnicode = u"1.此处是中文字符;2.而你之所以能正确看到此处中文字符,是因为(1)此处python文件中,通过开始的编码指定为UTF-8(2)并且本身Python文件也是UTF-8编码保存的;3.接下来将要演示的是,将此段中文字符,转换为GBK编码,然后在windows的cmd中输出;";
    print "type(zhcnUnicode)=",type(zhcnUnicode); #type(zhcnUnicode)= <type 'unicode'>
    zhcnGBK = zhcnUnicode.encode("GBK");
    print "You should see these zh-CN chars in windows cmd normally: zhcnGBK=%s"%(zhcnGBK); #You should see these zh-CN chars in windows cmd normally: zhcnGBK=1.此处是中文字符;...... 然后在windows的cmd中输出;
    
###############################################################################
if __name__=="__main__":
    python2xUnicodeToStr();

python_2.x_str_to_unicode.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str
 
http://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python2xStrToUnicode():
    strUtf8 = "1.此处是UTF-8编码的中文字符(之所以不是其他编码,是因为我们此处文件开头指定了是UTF-8,并且此Python文件本身也是以UTF-8编码保存的,这样才能确保Python解析器,正确解析本文件,及其所包含的字符);2.接下来将要演示的是,将此段UTF-8的中文字符,解码为对应的Unicode字符;3.然后输出到windows的cmd中(其中unicode字符在输出打印时,会自动转换为对应的(此处的GBK)编码的);";
    print "type(strUtf8)=",type(strUtf8); #type(strUtf8)= <type 'str'>
    decodedUnicode = strUtf8.decode("UTF-8");
    print "You should see these unicode zh-CN chars in windows cmd normally: decodedUnicode=%s"%(decodedUnicode); #You should see these unicode zh-CN chars in windows cmd normally: decodedUnicode=1.此处是UTF-8编码的中文字符 ...... 转换为对应的(此处的GBK)编码的);
    
###############################################################################
if __name__=="__main__":
    python2xStrToUnicode();

python_3.x_str_to_bytes.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str
 
http://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python3xStrToBytes():
    """Demo Python 3.x (unicode) str to bytes
    """
    
    zhcnUnicode = "1.此处的,Python 3.x中,默认字符串的写法,就已经是unicode类型的字符串了。2.当然,还是有一点前提的,那就是,你在(1)此处python文件所指定的编码类型(2)要和你当前python文件实际所采用的编码类型,要匹配和一致,即此处,两者均是UTF-8,所以,Python解析器,才能正确的将我们此处所输入的UTF-8的中文字符,正确地解码为对应的Unicode字符串的;3.接下来将要演示的是,打印对于的此处字符的类型;然后再直接输出显示到windows的GBK编码的cmd中";
    print("type(zhcnUnicode)=",type(zhcnUnicode)); #type(zhcnUnicode)= <class 'str'>
    zhcnGbkBytes = zhcnUnicode.encode("GBK");
    print("You should see these zh-CN bytes in windows cmd normally, which begin with b preffix: zhcnGbkBytes=%s"%(zhcnGbkBytes)); #You should see these zh-CN bytes in windows cmd normally, which begin with b preffix: zhcnGbkBytes=b'1.xb4xcbxb4xa6xb5 ...... xc2xebxb5xc4cmdxd6xd0'
    
###############################################################################
if __name__=="__main__":
    python3xStrToBytes();

python_3.x_bytes_to_str.py

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------------------------------------
Function:
【整理】Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str
 
http://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str
 
Author:     Crifan
Verison:    2012-11-29
-------------------------------------------------------------------------------
"""
 
def python3xBytesToStr():
    """Demo Python 3.x bytes to (unicode) str
    """
    
    #此处的bytes,只能接受ASCII字符
    #想要输入非ASCII的字符,则只能通过xYY的十六进制方式输入,其中YY为对应的16进制的值
    #此处,我是已经在别处,通过把对应的中文:
    #"1.Python 3.x中,给字符串前面添加字母b,表示是bytes的字符串;2.此处之所以可以实现,接下来的,Python解析器,可以正确的将bytes解码为Unicode的str,那是因为(1)此处python文件所指定的编码类型(2)要和你当前python文件实际所采用的编码类型,是一致的,都是UTF-8;3.接下来将要演示的是,将此bytes字符串,解码为Unicode的str,然后在此处的终端,windows的默认编码为GBK的cmd中显示出来;";
    #解析为UTF-8的bytes了,所以下面你看到的是,解析后的,一堆bytes
    
    zhcnBytes = b"1.xe6xadxa4xe5xa4x84xe7x9ax84xefxbcx8cPython 3.xxe4xb8xadxefxbcx8cxe9xbbx98xe8xaexa4xe5xadx97xe7xacxa6xe4xb8xb2xe7x9ax84xe5x86x99xe6xb3x95xefxbcx8cxe5xb0xb1xe5xb7xb2xe7xbbx8fxe6x98xafunicodexe7xb1xbbxe5x9ex8bxe7x9ax84xe5xadx97xe7xacxa6xe4xb8xb2xe4xbax86xe3x80x822.xe5xbdx93xe7x84xb6xefxbcx8cxe8xbfx98xe6x98xafxe6x9cx89xe4xb8x80xe7x82xb9xe5x89x8dxe6x8fx90xe7x9ax84xefxbcx8cxe9x82xa3xe5xb0xb1xe6x98xafxefxbcx8cxe4xbdxa0xe5x9cxa8(1)xe6xadxa4xe5xa4x84pythonxe6x96x87xe4xbbxb6xe6x89x80xe6x8cx87xe5xaex9axe7x9ax84xe7xbcx96xe7xa0x81xe7xb1xbbxe5x9ex8b(2)xe8xa6x81xe5x92x8cxe4xbdxa0xe5xbdx93xe5x89x8dpythonxe6x96x87xe4xbbxb6xe5xaex9exe9x99x85xe6x89x80xe9x87x87xe7x94xa8xe7x9ax84xe7xbcx96xe7xa0x81xe7xb1xbbxe5x9ex8bxefxbcx8cxe8xa6x81xe5x8cxb9xe9x85x8dxe5x92x8cxe4xb8x80xe8x87xb4xefxbcx8cxe5x8dxb3xe6xadxa4xe5xa4x84xefxbcx8cxe4xb8xa4xe8x80x85xe5x9dx87xe6x98xafUTF-8xefxbcx8cxe6x89x80xe4xbbxa5xefxbcx8cPythonxe8xa7xa3xe6x9ex90xe5x99xa8xefxbcx8cxe6x89x8dxe8x83xbdxe6xadxa3xe7xa1xaexe7x9ax84xe5xb0x86xe6x88x91xe4xbbxacxe6xadxa4xe5xa4x84xe6x89x80xe8xbex93xe5x85xa5xe7x9ax84UTF-8xe7x9ax84xe4xb8xadxe6x96x87xe5xadx97xe7xacxa6xefxbcx8cxe6xadxa3xe7xa1xaexe5x9cxb0xe8xa7xa3xe7xa0x81xe4xb8xbaxe5xafxb9xe5xbax94xe7x9ax84Unicodexe5xadx97xe7xacxa6xe4xb8xb2xe7x9ax84xefxbcx9b3.xe6x8exa5xe4xb8x8bxe6x9dxa5xe5xb0x86xe8xa6x81xe6xbcx94xe7xa4xbaxe7x9ax84xe6x98xafxefxbcx8cxe6x89x93xe5x8dxb0xe5xafxb9xe4xbax8exe7x9ax84xe6xadxa4xe5xa4x84xe5xadx97xe7xacxa6xe7x9ax84xe7xb1xbbxe5x9ex8bxefxbcx9bxe7x84xb6xe5x90x8exe5x86x8dxe7x9bxb4xe6x8exa5xe8xbex93xe5x87xbaxe6x98xbexe7xa4xbaxe5x88xb0windowsxe7x9ax84GBKxe7xbcx96xe7xa0x81xe7x9ax84cmdxe4xb8xad";
    print("type(zhcnBytes)=",type(zhcnBytes)); #type(zhcnBytes)= <class 'bytes'>
    zhcnUnicodeStr = zhcnBytes.decode("UTF-8");
    print("You should see these zh-CN unicode str in windows cmd normally: zhcnUnicodeStr=%s"%(zhcnUnicodeStr)); #You should see these zh-CN unicode str in windows cmd normally: zhcnUnicodeStr=1.此处的,Python 3.x中 ...... 然后再直接输出显示到windows的GBK编码的cmd中
    
###############################################################################
if __name__=="__main__":
    python3xBytesToStr();

 

转载请注明:爱开源 » Python中字符编码的总结和对比:Python 2.x的str和unicode vs Python 3.x的bytes和str

您必须 登录 才能发表评论!