str和unicode类

时间:2023-01-21 10:11:30

在py2中,分为两类,str和unicode

而在py3中,分为两类,byte和str

py2中的str等同于py3中的byte

首先明确一点,我们编辑好一段文本,python并不知道我们的文本是以什么格式编码的。如果是纯英文字符还好说,如果这段代码中有汉字,则会报错了。

所以我们要显式的告诉python此文本的编码格式。

为了说明问题,首先将以下测试代码以utf-8格式编辑保存

 # -*- coding:utf-8 -*-  #告知python我这个文件里的文本是用utf-8编码的,如果不加,而文本中又包含汉字,没运行前就会报错
import time a = '严'
print a#乱码,a是utf-8格式,而windows控制台使用gbk进行解码
b = unicode(a,'utf-8').encode('gbk')#将严先解码为unicode格式,在编码为gbk格式
print b#正确显示严
c = a.decode('utf-8')#等效于c = unicode('严','utf-8'),亦等效于c = u'严' c是unicode格式的
print type(a),type(b),type(c)#a,b都是str类,c是unicode类
print c
time.sleep(4)

但是还有一个疑问,既然windows控制台使用gbk解码,为什么utf8的a是乱码,而unicode的b就不会是乱码呢?

因为Python在向控制台输出unicode对象的时候会自动根据输出环境的编码进行转换,这样就能正确解码了。但如果输出的不是unicode对象而是普通字符串,则控制台并不会参考我们声明的编码格式进行str到unicode的转换,而是直接会按照终端编码去解码a(cmd编码为gbk,linux系统默认编码为utf8),当然会出错

事实上最简单的str转unicode的方式是在字符串前加u,如u'严',python会根据第一行标明的coding,来认定‘严’的格式,然后转换为unicode格式

2.encode与decode

首先明确一点,python认定unicode为指定编码。从其他编码转为unicode叫做解码,从unicode转为str叫做编码,

而任何两种字符编码之间如果想完成转化,必须要通过unicode这个桥梁,先把它抓化成unicode对象,在转为另一个编码

encode是将unicode类对象编码成其他格式,所以正规调用为unicode.encode()

decode是将str类对象解码成unicode类对象,所以正规调用是str.decode()

但是Python允许str.encode(),也允许unicode.decode()。

这里涉及隐式类型转化的问题

str.encode()实际上就等价于str.decode(sys.getdefaultencoding()).encode().而sys.defaultencoding如果不改的话默认是ascii,所以这里的str不能是中文字符。

unicode.decode()会先将unicode转化成str,然后再执行decode()

函数decode()有默认参数,默认参数为sys.getdefaultencoding()。

3关于sys.getdefaultencoding()

这是sys模块的内置方法,该方法返回python的默认编码。

以下为转载:http://liguangming.com/how-to-use-utf-8-with-python

python 中获得系统默认编码为:

import sys
print sys.getdefaultencoding()
而修改系统默认编码应写为:
import sys
reload(sys)
sys.setdefaultencoding('UTF-8')
为什么需要一个看似多余的reload(sys)呢? 因为python初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入

先看下python的模块加载过程:

# python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /usr/local/lib/python2.6/site.pyc matches /usr/local/lib/python2.6/site.py
import site # precompiled from /usr/local/lib/python2.6/site.pyc
....
Python运行的时候首先加载了site.py,在site.py文件里有这么一段代码:
if hasattr(sys, "setdefaultencoding"):
del sys.setdefaultencoding

在sys加载后,setdefaultencoding方法被删除了,所以我们要通过重新导入sys来设置系统编码.

4

判断是否为unicode/str的方法

  1. >>> isinstance(u‘中文‘, unicode) True
  2. >>> isinstance(‘中文‘, unicode) False
  3. >>> isinstance(‘中文‘, str) True
  4. >>> isinstance(u‘中文‘, str) False

5py3中的bytes和unicode

如果说在Python2中,第一行的声明可以和文件实际采用的编码格式不相一致,只是这样就不能用u'汉字'的形式将str转换为unicode了,但是仍然可以用unicode方法或decode方法转换。比如我在python文件中声明coding=utf-8,而我编辑这个文件的时候实际采用的编码是gbk。所以在python2中第一行声明conding的作用好像也仅仅局限于可以用u'汉字'的形式将str转换为unicode了。声明错了也无大碍。当然最好要保持一致。

但是在python3中,第一行声明的coding就作用大了,必须声明正确。直接用代码加以说明吧,代码来自大神crifanhttps://www.crifan.com/summary_python_string_encoding_decoding_difference_and_comparation_python_2_x_str_unicode_vs_python_3_x_bytes_str/

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.\xb4\xcb\xb4\xa6\xb5 ...... \xc2\xeb\xb5\xc4cmd\xd6\xd0' ###############################################################################
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.\xe6\xad\xa4\xe5\xa4\x84\xe7\x9a\x84\xef\xbc\x8cPython 3.x\xe4\xb8\xad\xef\xbc\x8c\xe9\xbb\x98\xe8\xae\xa4\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe7\x9a\x84\xe5\x86\x99\xe6\xb3\x95\xef\xbc\x8c\xe5\xb0\xb1\xe5\xb7\xb2\xe7\xbb\x8f\xe6\x98\xafunicode\xe7\xb1\xbb\xe5\x9e\x8b\xe7\x9a\x84\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe4\xba\x86\xe3\x80\x822.\xe5\xbd\x93\xe7\x84\xb6\xef\xbc\x8c\xe8\xbf\x98\xe6\x98\xaf\xe6\x9c\x89\xe4\xb8\x80\xe7\x82\xb9\xe5\x89\x8d\xe6\x8f\x90\xe7\x9a\x84\xef\xbc\x8c\xe9\x82\xa3\xe5\xb0\xb1\xe6\x98\xaf\xef\xbc\x8c\xe4\xbd\xa0\xe5\x9c\xa8(1)\xe6\xad\xa4\xe5\xa4\x84python\xe6\x96\x87\xe4\xbb\xb6\xe6\x89\x80\xe6\x8c\x87\xe5\xae\x9a\xe7\x9a\x84\xe7\xbc\x96\xe7\xa0\x81\xe7\xb1\xbb\xe5\x9e\x8b(2)\xe8\xa6\x81\xe5\x92\x8c\xe4\xbd\xa0\xe5\xbd\x93\xe5\x89\x8dpython\xe6\x96\x87\xe4\xbb\xb6\xe5\xae\x9e\xe9\x99\x85\xe6\x89\x80\xe9\x87\x87\xe7\x94\xa8\xe7\x9a\x84\xe7\xbc\x96\xe7\xa0\x81\xe7\xb1\xbb\xe5\x9e\x8b\xef\xbc\x8c\xe8\xa6\x81\xe5\x8c\xb9\xe9\x85\x8d\xe5\x92\x8c\xe4\xb8\x80\xe8\x87\xb4\xef\xbc\x8c\xe5\x8d\xb3\xe6\xad\xa4\xe5\xa4\x84\xef\xbc\x8c\xe4\xb8\xa4\xe8\x80\x85\xe5\x9d\x87\xe6\x98\xafUTF-8\xef\xbc\x8c\xe6\x89\x80\xe4\xbb\xa5\xef\xbc\x8cPython\xe8\xa7\xa3\xe6\x9e\x90\xe5\x99\xa8\xef\xbc\x8c\xe6\x89\x8d\xe8\x83\xbd\xe6\xad\xa3\xe7\xa1\xae\xe7\x9a\x84\xe5\xb0\x86\xe6\x88\x91\xe4\xbb\xac\xe6\xad\xa4\xe5\xa4\x84\xe6\x89\x80\xe8\xbe\x93\xe5\x85\xa5\xe7\x9a\x84UTF-8\xe7\x9a\x84\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\xef\xbc\x8c\xe6\xad\xa3\xe7\xa1\xae\xe5\x9c\xb0\xe8\xa7\xa3\xe7\xa0\x81\xe4\xb8\xba\xe5\xaf\xb9\xe5\xba\x94\xe7\x9a\x84Unicode\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2\xe7\x9a\x84\xef\xbc\x9b3.\xe6\x8e\xa5\xe4\xb8\x8b\xe6\x9d\xa5\xe5\xb0\x86\xe8\xa6\x81\xe6\xbc\x94\xe7\xa4\xba\xe7\x9a\x84\xe6\x98\xaf\xef\xbc\x8c\xe6\x89\x93\xe5\x8d\xb0\xe5\xaf\xb9\xe4\xba\x8e\xe7\x9a\x84\xe6\xad\xa4\xe5\xa4\x84\xe5\xad\x97\xe7\xac\xa6\xe7\x9a\x84\xe7\xb1\xbb\xe5\x9e\x8b\xef\xbc\x9b\xe7\x84\xb6\xe5\x90\x8e\xe5\x86\x8d\xe7\x9b\xb4\xe6\x8e\xa5\xe8\xbe\x93\xe5\x87\xba\xe6\x98\xbe\xe7\xa4\xba\xe5\x88\xb0windows\xe7\x9a\x84GBK\xe7\xbc\x96\xe7\xa0\x81\xe7\x9a\x84cmd\xe4\xb8\xad";
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 3.x中对于你所写的字符串,默认会自动解析并存储为Unicode的,(这里的存储,指的是代码从文件载入到内存中)所有后期的各种处理,包括在cmd中的输出,都会很好的自动转换为对应的编码并输出显示的,比如输出到cmd中,会自动转换为cmd的GBK编码,得以正确显示的

#-*-coding:utf8;-*-
#py2
a='新'
b='\xe6\x96\xb0'
print a==b#True
#a在百分之99的情况下都与b相同,只有一种情况下不同
c=u'新'
d=u'\xe6\x96\xb0'#报错
#-*-coding:utf8;-*-
#py2
a=u'\u4e2d'
b=u'中'
print a==b#true
#-*-coding:utf8;-*-
#py3 a='\u4e2d'
b='中'
print (a==b)#true

str和unicode类的更多相关文章

  1. python知识:json格式文本;异常处理;字符串处理;unicode类型和str类型转换

    python进程中的实例和json格式的字符串之间的映射关系是非常直接的,相当于同一个概念被编码成不同的表示: stream in json form ----json.loads(str)----- ...

  2. python的str,unicode对象的encode和decode方法

    python的str,unicode对象的encode和decode方法 python中的str对象其实就是"8-bit string" ,字节字符串,本质上类似java中的byt ...

  3. python的str,unicode对象的encode和decode方法(转)

    python的str,unicode对象的encode和decode方法(转) python的str,unicode对象的encode和decode方法 python中的str对象其实就是" ...

  4. python的str,unicode对象的encode和decode方法&comma; Python中字符编码的总结和对比bytes和str

    python_2.x_unicode_to_str.py a = u"中文字符"; a.encode("GBK"); #打印: '\xd6\xd0\xce\xc ...

  5. &lbrack;转&rsqb;Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  6. &lbrack;Python&rsqb; 中文编码问题:raw&lowbar;input输入、文件读取、变量比较等str、unicode、utf-8转换问题

    最近研究搜索引擎.知识图谱和Python爬虫比较多,中文乱码问题再次浮现于眼前.虽然市面上讲述中文编码问题的文章数不胜数,同时以前我也讲述过PHP处理数据库服务器中文乱码问题,但是此处还是准备简单做下 ...

  7. Python中的str与unicode处理方法

    Python中的str与unicode处理方法 2015/03/25 · 基础知识 · 3 评论· Python 分享到:42 原文出处: liuaiqi627 的博客    python2.x中处理 ...

  8. PYTHON编码处理-str与Unicode的区别

    一篇关于STR和UNICODE的好文章 整理下python编码相关的内容 注意: 以下讨论为Python2.x版本, Py3k的待尝试 开始 用python处理中文时,读取文件或消息,http参数等等 ...

  9. python中的str,unicode和gb2312

    实例1: v1=u '好神奇的问题!?' type(v1)->unicode v1.decode("utf-8")# not work,because v1 is unico ...

随机推荐

  1. MySQL性能调优my&period;cnf详解

    [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir  ...

  2. Maven&lpar;一&rpar;maven环境搭建

    1.下载maven安装文件 https://maven.apache.org/download.cgi#,根据自己的需要下载对应版本 2. 配置maven环境变量,和java环境变量配置方式类似.   ...

  3. IOS 推送-客户端处理推送消息

    IOS 推送-客户端处理推送消息 1.推送调用顺序 APN push的消息到达后,UIApplicationDelegate有两个方法和处理消息有关: 1)application:didReceive ...

  4. jira与mysql的配合搭建调整

    jira与mysql数据的整合 第一步:电脑上安装mysql数据库,不做多得解释,自己搞定 第二步: 在mysql数据库中建一个名为 jiradb的数据库,账号 root 密码 root 编码格式 u ...

  5. 【leetcode】Partition List(middle)

    Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ...

  6. Node&period;js&amp&semi;NPM的安装与配置&lpar;转&rpar;

    Node.js安装与配置 Node.js已经诞生两年有余,由于一直处于快速开发中,过去的一些安装配置介绍多数针对0.4.x版本而言的,并非适合最新的0.6.x的版本 情况了,对此,我们将在0.6.x的 ...

  7. Node&period;js HTTP 使用详解

    对于初学者有没有发觉在查看Node.js官方API的时候非常简单,只有几个洋文描述两下子,没了,我第一次一口气看完所以API后,对于第一个示例都有些懵,特别是参数里的request和response, ...

  8. Android图表库MPAndroidChart&lpar;八&rpar;——饼状图的扩展:折线饼状图

    Android图表库MPAndroidChart(八)--饼状图的扩展:折线饼状图 我们接着上文,饼状图的扩展,增加折现的说明,来看下我们要实现的效果 因为之前对MPAndroidChart的熟悉,所 ...

  9. The first day in cnblogs

    2018.12.16,学习OI的第4个月零20天,我在博客园开通了属于自己的博客.

  10. WinHex数据恢复笔记(二)

    续写上次笔记: 1.Winhex数据恢复软件的界面上的所有功能已经介绍了一遍,最主要的还是编程恢复的能力. 今天主要看看记事本的编辑恢复及其相关的一些问题,记事本的 编辑值是ASCII值,所以没有文件 ...