python2编码问题

看了以下两篇博文的基础上,感觉自己明白了点。记录下。

http://www.cnblogs.com/yuanchenqi/articles/5938733.html

http://www.cnblogs.com/yuanchenqi/articles/5956943.html

python2的编解码的几个问题:

(1)两种数据类型unicode 和 str。

  unicode-->str 的过程是编码,可以用encode(‘utf8‘)这种方式表示,也可以用str()把unicode变成str类型,

  另外,str-->unicode 是解码过程,unicode(str),或者str.decode(‘utf8‘) 都可以。

但是python2中系统默认的编码是ASCII码,即使你在编辑.py 文件里声明了coding是utf8,那么在执行str(u‘\uXXXX’) 或者 unicode()时,默认还是使用ASCII码进行编解码。

    除非使用代码改变system的default encoding。

如果变量是英文的,相应的编解码test如下:

import sys
print(sys.getdefaultencoding())

# 定义a1是英文 str类型
a1 = "hello world"
print "-----a1--------"
print a1
print type(a1)
print repr(a1)

# str(str类型)直接返回str类型
print "-----b1--------"
b1 = str(a1)
print b1
print type(b1)
print repr(b1)

#unicode(str类型)返回通过ASCII解码方式成unicode
print "-----c1--------"
c1 = unicode(a1)
print c1
print type(c1)
print repr(c1)

#用decode方式,把str解码成unicode,对应c1
print "-----d1--------"
d1 = a1.decode(‘utf8‘)
print d1
print type(d1)
print repr(d1)

# 定义a2是英文 unicode类型
print "-----a2--------"
a2 = u‘hello world‘
print a2
print type(a2)
print repr(a2)

# str(unicode类型)相当于用默认的ASCII码编码成str
print "-----b2--------"
b2 = str(a2)
print b2
print type(b2)
print repr(b2)

#unicode unicode类型)不变
print "-----c2--------"
c2 = unicode(a2)
print c2
print type(c2)
print repr(c2)

# 用encode编码,对应b2部分
print "-----d2--------"
d2 = a2.encode(‘utf8‘)
print d2
print type(d2)
print repr(d2)

运行结果:
ascii
-----a1--------
hello world
<type ‘str‘>
‘hello world‘
-----b1--------
hello world
<type ‘str‘>
‘hello world‘
-----c1--------
hello world
<type ‘unicode‘>
u‘hello world‘
-----d1--------
hello world
<type ‘unicode‘>
u‘hello world‘
-----a2--------
hello world
<type ‘unicode‘>
u‘hello world‘
-----b2--------
hello world
<type ‘str‘>
‘hello world‘
-----c2--------
hello world
<type ‘unicode‘>
u‘hello world‘
-----d2--------
hello world
<type ‘str‘>
‘hello world‘

相对应的,如果变量是中文的,那么相应的编解码结果如下:

# -*- coding:utf-8 -*-
import sys
print(sys.getdefaultencoding())

# 定义a1是英文 str类型
a1 = "I am 熊猫"
print "-----a1--------"
print a1
print type(a1)
print repr(a1)

# str(str类型)直接返回str类型
print "-----b1--------"
b1 = str(a1)
print b1
print type(b1)
print repr(b1)

# #unicode(str类型)返回通过ASCII解码方式成unicode
# print "-----c1--------"
# c1 = unicode(a1)  #运行结果:UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe7 in position 5: ordinal not in range(128)
# print c1
# print type(c1)
# print repr(c1)

#用decode方式,把str解码成unicode,对应c1
print "-----d1--------"
d1 = a1.decode(‘utf8‘)
print d1
print type(d1)
print repr(d1)

# 定义a2是英文 unicode类型
print "-----a2--------"
a2 = u‘I am 熊猫‘
print a2
print type(a2)
print repr(a2)

# # str(unicode类型)相当于用默认的ASCII码编码成str
# print "-----b2--------"
# b2 = str(a2)  #运行结果:UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 5-6: ordinal not in range(128)
# print b2
# print type(b2)
# print repr(b2)

#unicode unicode类型)不变
print "-----c2--------"
c2 = unicode(a2)
print c2
print type(c2)
print repr(c2)

# 用encode编码,对应b2部分
print "-----d2--------"
d2 = a2.encode(‘utf8‘)
print d2
print type(d2)
print repr(d2)

运行结果:
ascii
-----a1--------
I am 熊猫
<type ‘str‘>
‘I am \xe7\x86\x8a\xe7\x8c\xab‘
-----b1--------
I am 熊猫
<type ‘str‘>
‘I am \xe7\x86\x8a\xe7\x8c\xab‘
-----d1--------
I am 熊猫
<type ‘unicode‘>
u‘I am \u718a\u732b‘
-----a2--------
I am 熊猫
<type ‘unicode‘>
u‘I am \u718a\u732b‘
-----c2--------
I am 熊猫
<type ‘unicode‘>
u‘I am \u718a\u732b‘
-----d2--------
I am 熊猫
<type ‘str‘>
‘I am \xe7\x86\x8a\xe7\x8c\xab‘

对于带有中文的部分,如果修改相应的系统默认编码,那么使用str或者unicode也不会出错:

# -*- coding:utf-8 -*-
import sys
print(sys.getdefaultencoding())
reload(sys)
sys.setdefaultencoding(‘utf8‘)
print(sys.getdefaultencoding())

# 定义a1是英文 str类型
a1 = "I am 熊猫"
print "-----a1--------"
print a1
print type(a1)
print repr(a1)

# str(str类型)直接返回str类型
print "-----b1--------"
b1 = str(a1)
print b1
print type(b1)
print repr(b1)

#unicode(str类型)返回通过ASCII解码方式成unicode
print "-----c1--------"
c1 = unicode(a1)
print c1
print type(c1)
print repr(c1)

#用decode方式,把str解码成unicode,对应c1
print "-----d1--------"
d1 = a1.decode(‘utf8‘)
print d1
print type(d1)
print repr(d1)

# 定义a2是英文 unicode类型
print "-----a2--------"
a2 = u‘I am 熊猫‘
print a2
print type(a2)
print repr(a2)

# str(unicode类型)相当于用默认的ASCII码编码成str
print "-----b2--------"
b2 = str(a2)
print b2
print type(b2)
print repr(b2)

#unicode unicode类型)不变
print "-----c2--------"
c2 = unicode(a2)
print c2
print type(c2)
print repr(c2)

# 用encode编码,对应b2部分
print "-----d2--------"
d2 = a2.encode(‘utf8‘)
print d2
print type(d2)
print repr(d2)

运行结果:
ascii
utf8
-----a1--------
I am 熊猫
<type ‘str‘>
‘I am \xe7\x86\x8a\xe7\x8c\xab‘
-----b1--------
I am 熊猫
<type ‘str‘>
‘I am \xe7\x86\x8a\xe7\x8c\xab‘
-----c1--------
I am 熊猫
<type ‘unicode‘>
u‘I am \u718a\u732b‘
-----d1--------
I am 熊猫
<type ‘unicode‘>
u‘I am \u718a\u732b‘
-----a2--------
I am 熊猫
<type ‘unicode‘>
u‘I am \u718a\u732b‘
-----b2--------
I am 熊猫
<type ‘str‘>
‘I am \xe7\x86\x8a\xe7\x8c\xab‘
-----c2--------
I am 熊猫
<type ‘unicode‘>
u‘I am \u718a\u732b‘
-----d2--------
I am 熊猫
<type ‘str‘>
‘I am \xe7\x86\x8a\xe7\x8c\xab‘

(2)python2,当unicode和str 相连时,默认的,Python2会按照默认编码,把str先变成unicode进行相连。

(4)无论py2,还是py3,与明文直接对应的就是unicode数据,打印unicode数据就会显示相应的明文(包括英文和中文)

(5)当使用print时,print A 相当于 sys.stdout.write(str(A))

(6)在windows cmd窗口的中文乱码问题。

(7)open文件时的中文乱码问题

(8)print list和dict时中文乱码问题

原文地址:https://www.cnblogs.com/zhangqiella/p/10524760.html

时间: 2024-10-10 01:57:56

python2编码问题的相关文章

python3与python2编码导致 hmac.new/base64.b64encode(&#39;value&#39;) python3各种报错

python3编码的请查看这篇文章:https://www.cnblogs.com/575dsj/p/7112767.html 第一次:python3传的是bytes不能是str.好吧,认了.我就传bytes吧 b= hmac.new('/admindevice/GetCameraSetting','adbaskjclas',sha1).hexdigest()print(b) ------------------------------------------------------------

python2编码总结

以下依次列出python2常遇到的几个问题及讲解. # -*- coding:utf-8 -*- python2默认以ASCII编码,但是在实际编码过程中,我们会用到很多中文,为了不使包含中文的程序报错,也是为了符合国际通用惯例,一般将我们的文件编码设置为utf-8格式. 设定编码的格式有很多种,只要第一行或者第二行的声明符合正则表达式 "coding[:=]\s*([-\w.]+)" 即可,一般的声明方式为#-*- coding:utf-8 -*-. str = "你好&q

python2编码总结(转)

以下依次列出python2常遇到的几个问题及讲解. # -*- coding:utf-8 -*- python2默认以ASCII编码,但是在实际编码过程中,我们会用到很多中文,为了不使包含中文的程序报错,也是为了符合国际通用惯例,一般将我们的文件编码设置为utf-8格式. 设定编码的格式有很多种,只要第一行或者第二行的声明符合正则表达式 "coding[:=]\s*([-\w.]+)" 即可,一般的声明方式为#-*- coding:utf-8 -*-. str = "你好&q

【转】Python2编码大坑详解

作者: jinhaolin 出处: http://www.cnblogs.com/jinhaolin/> 以下依次列出python2常遇到的几个问题及讲解. # -*- coding:utf-8 -*- python2默认以ASCII编码,但是在实际编码过程中,我们会用到很多中文,为了不使包含中文的程序报错,也是为了符合国际通用惯例,一般将我们的文件编码设置为utf-8格式. 设定编码的格式有很多种,只要第一行或者第二行的声明符合正则表达式 "coding[:=]\s*([-\w.]+)&

Python2 编码问题分析

本文浅显易懂,绿色纯天然,手工制作,请放心阅读. 编码问题是一个很大很杂的话题,要向彻底的讲明白可以写一本书了.导致乱码的原因很多,系统平台.编程语言.多国语言.软件程序支持.用户选择等都可能导致无法正确的解析编码. 导致乱码的主要原因可以简单归结于文本的编码方式和解码方式不同导致的.本文将通过在win7(zh-cn)系统下分析python2.7的编解码问题来简单窥探一下编码的冰山一角. 今后遇到编码问题时能够多一点分析解决思路,要是能起到一个抛砖引玉的作用,那就再好不过了. 1.为什么需要编码

从python2,python3编码问题引伸出的通用编码原理解释

今天使用python2编码时遇到这样一条异常UnicodeDecodeError: ‘ascii’ code can’t decode byte 0xef 发现是编码问题,但是平常在python3中几乎没有遇到过,所以特意查了资料,原来python3和python2对于字符串的理解不一样,在python3中,字符串默认unicode编码 一.解释python2和python3文本处理方式 在Python3当中,文本字符串类型(使用Unicode数据存储)被命名为 str , 字节字符串类型被命名

python2和python3编码

python2编码 unicode:unicode 你好 u'\u4f60\u597d' | | | | encode('utf8')| |decode('utf8') encode('gbk')| |decode('gbk') | |   | | utf8    gbk编码后的str '\xe4\xbd\xa0\xe5\xa5\xbd'     编码后的gbk u'\u6d63\u72b2\u30bd' # str: bytes >>> s = '你好 world' >>&

python基础篇10-py2和py3编码

编码基础 编码概述 基本概念很简单.首先,我们从一段信息即消息说起,消息以人类可以理解.易懂的表示存在.我打算将这种表示称为“明文”(plain text).对于说英语的人,纸张上打印的或屏幕上显示的英文单词都算作明文.其次,我们需要能将明文表示的消息转成另外某种表示,我们还需要能将编码文本转回成明文.从明文到编码文本的转换称为“编码”,从编码文本又转回成明文则为“解码”. python解释器在加载 .py 文件中的代码时,会对内容进行编码.python2 默认编码方式是ascii码,pytho

彻底弄懂python编码

在编写python程序的过程中,中英文混用经常会出现编码问题.围绕此问题,本文首先介绍编码的含义及常用编码,随后列举几个python经常遇到的编码异常及解决方法,接着列举笔者在实践中遇到的异常出现的情景及原因,最后针对编码问题提出最佳实践. 一 常见编码 1.1 unicode编码 在文本文件中,看到的所有字符,包括中文,都需要在计算机中存储,而计算机只能存储0和1这样的二进制位,所以需要一种方法,将字符映射成数字,然后将数字转化为二进制位存储在计算机中.针对字符和数字的映射的问题,产生了uni