Python——str字符串和unicode字符串_Vic时代的博客
文章推薦指數: 80 %
对于处理过中文的Python程序员来说,想必被UnicodeEncodeError和UnicodeDecodeError并不陌生。
为了更好的理解Python中的编码问题,我们首先介绍一下 ...
Python——str字符串和unicode字符串
Vic时代
于 2017-07-1817:34:30 发布
41239
收藏
15
分类专栏:
编程语言Python
版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/VictoriaW/article/details/75314737
版权
编程语言Python
专栏收录该内容
68篇文章
2订阅
订阅专栏
对于处理过中文的Python程序员来说,想必对UnicodeEncodeError和UnicodeDecodeError并不陌生。
为了更好的理解Python中的编码问题,我们首先介绍一下字符编码以及Python的两种字符串类型:str和unicode之间的区别。
字符编码
我们在编辑器中输入的文字,对用户来说是可读的。
但是机器只能读懂01串,那怎么把我们方便阅读的符号转换成机器能读懂的01串呢?
这就需要给出符号-二进制之间的映射关系,而且必须是一一映射:即给定一个符号,机器有而且有唯一的二进制对应。
根据字符得到二进制表示是编码过程(encode);根据二进制表示得到字符是解码过程(decode)。
ASCII字符集与字符编码
刚开始的时候,给出了ASCII标准,用一个8bits字节来表示字符。
而且这个字节实际上只用了7位,最高位是不用的,这样总共能表示128个字符。
意味着ASCII字符集只有128个。
随着计算机的普及,越来越多的国家开始使用计算机。
128个字符难以满足各个国家的语言需求,这促使包含更多字符的字符集诞生,并且需要采用新的编码方案。
Latin-1
充分利用8bits字节的高位,扩展到256个字符。
Unicode字符集与字符编码
Unicode字符集包含了所有种语言的所有字符。
通常用U+后接4位的16进制数字表示一个Unicode字符,比如U+FFFF。
UTF-8编码
UTF-8是针对Unicode字符集的一种编码方案。
用变长字节来表示字符:有的字符用一个字节表示(比如ASCII中规定的字符),有的字符用2个字节表示。
最大长度为4字节。
上面这张图是从Wikipedia中截取的。
NumberofBytes列表示字节数;Bitsforcodepoint列表示多少个bit位是真正有用的;Firstcodepoint列表示该字节数能表示的第一个Unicode字符;Lastcodepoint列表示对应字节数能表示的最后一个Unicode字符;Bytei(i=1,2,3,4)列表示第i字节上的bit值。
以第二行为例,这一行的编码需要两个字节,其中真正有用的bit位只有11个,另5位是占位符,能表示从U+0080~U+07FF的Unicode字符。
至于具体的编码方式,我们以欧元符号€为例。
€在Unicode字符集中对应U+20AC:
U+20AC位于U+0800~U+FFFF之间,所以需要三个字节来表示;十六进制20AC可以写成二进制:0010000010101100;前4个bit放在第一字节的低4位:11100010;中间6个bit放在第二字节的低6位:10000010;后6个bit放在第三字节的低6位:10101100;于是€的UTF-8编码为:111000101000001010101100。
Unicode字符集还有其他的编码方式,这里就介绍到这里。
要记住:所有的编码方式都是向后兼容ASCII的。
ASCII字符对应什么二进制,那么在其他编码方式中也对应同样的二进制。
Python的字符串类型
Python包含两种字符串类型:str(其实就是二进制)和unicode。
当只会用到ASCII字符集时,一切相安无事。
一旦出现其他字符集,问题也就接踵而来。
所以下面我们着重介绍非ASCII字符串。
str类型我们平时写的用引号括起来的字符串都是str类型的。
>>>x='哈哈'
>>>x
'\xb9\xfe\xb9\xfe'
根据上面的打印结果,可以知道str类型的x存的其实是二进制序列,而非字符串。
为什么会出现这种情况呢?我们赋给x的明明是字符串。
其实很简单,x经过了一次隐形的编码过程encode()。
应该采用的是系统默认编码方案。
-unicode类型如果在引号的前面加上字符u,那么我们就得到一个unicode字符串:
>>>x=u'哈哈'
>>>x
u'\u54c8\u54c8'
unicode对象保存的是字符串本身,而非二进制序列。
比如程序中的unicode字符串中包含两个U+54c8字符。
unicode编码为str
但是有的时候,我们需要二进制序列,比如将数据写入文件、发送到网络或者写入数据库中时。
如果不进行任何处理,会出现错误:
>>>x=u'哈哈'
>>>x
u'\u54c8\u54c8'
>>>f=open('test.txt','w');
>>>f.write(x)
Traceback(mostrecentcalllast):
File"
而系统默认的编码方案是ASCII(可以通过sys.getdefaultencoding()查看),对非ASCII字符进行编码的时候,肯定会出现错误。
为了避免错误,在写入文件之前,应该用utf-8或者gbk编码方案对unicode字符串编码:
>>>x=u'哈哈'
>>>x
u'\u54c8\u54c8'
>>>f=open('test.txt','w');
>>>x=x.encode('utf-8')#unicode->str
>>>x
'\xe5\x93\x88\xe5\x93\x88'
>>>f.write(x)
str解码为unicode
当从文本中读取数据时,读到的是str字符串,而且我们已经知道,它保存的是二进制序列。
如果其中包含非ASCII文本,我们应该怎么恢复呢?这时候就要用到解码decode()。
>>>f=open('test.txt','w');
>>>x=f.read()
>>>x
'\xe5\x93\x88\xe5\x93\x88'
>>>x=x.decode('utf-8')#str->unicode
>>>x
u'\u54c8\u54c8'
一定要记得,用什么方式编码的就必须用什么方式解码。
不然的话,从二进制到字符的对应过程会出现UnicodeDecodeError。
print语句
print语句的参数需要是str类型,而且在执行的时候会用系统的编码方式对str进行隐式解码。
两个遗留问题
#-*-coding:utf-8-*-现在暂且认为如果脚本中包含中文,那么必须加上这个声明。
setdefaultencoding()这个方法貌似现在不可以用了。
我觉得这个设置与encode()、decode()在不指明参数的情况下的默认参数有关。
Vic时代
关注
关注
6
点赞
踩
15
收藏
打赏
1
评论
Python——str字符串和unicode字符串
对于处理过中文的Python程序员来说,想必被UnicodeEncodeError和UnicodeDecodeError并不陌生。
为了更好的理解Python中的编码问题,我们首先介绍一下字符编码以及Python的两种字符串类型:str和unicode之间的区别。
字符编码我们在编辑器中输入的文字,对用户来说是可读的。
但是机器只能读懂01串,那怎么把我们方便阅读的符号转换成机器能读懂的01串呢?这就需要
复制链接
扫一扫
专栏目录
Python中的str与unicode处理方法
wjy397的专栏
12-10
863
http://python.jobbole.com/81244/
python2.x中处理中文,是一件头疼的事情。
网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自己总结一篇文章。
我也会在以后学习中,不断的修改此篇博客。
这里假设读者已有与编码相关的基础知识,本文不再再次介绍,包括什么是utf-8,什么是unicode,它们之间有什么关系。
str与字节
评论 1
您还未登录,请先
登录
后发表或查看评论
源代码编码对中文字符串影响
caz28的专栏
09-22
204
以前写的一些代码里有中文字符串,最近有些奇怪问题,所以研究了一下。
#include
Unicode是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
字符串?
字符串或串(String)是由数字、字母、下划线组成的一串字符。
一般记为s=“a1a2···an...
python基础学习u"string"用法
OneWay的博客
02-10
552
u"string"
在string前面加上u,可以把string同意转换为Unicode类(统一码),便于规范输入输出
例子:
参考微信自动回复设置
#-*-coding:utf-8-*
importitchat
itchat.auto_login()
#itchat.send("Hello,filehelper",toUserName="filehelper&
字符串的Unicode
weixin_41040445的博客
04-10
262
Unicode简介
世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。
因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。
为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。
每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。
这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode当然是一个很大的集合,现在的规模可以容纳100多万个符号
pythonunicode和str_关于python2中的unicode和str以及python3中的str和bytes
weixin_39860280的博客
11-29
22
python3有两种表示字符序列的类型:bytes和str。
前者的实例包含原始的8位值;后者的实例包含Unicode字符。
python2中也有两种表示字符序列的类型,分别叫做str和unicode。
与python3不同的是,str的实例包含原始的8位值,而unicode的实例,则包含Unicode字符。
上面两句话我特别不懂,所以文章后面就下是希望为了把上面两句话弄懂。
看几个例子:#在python2...
python的str与unicode类型
HayPinF的博客
05-04
195
参考https://blog.csdn.net/VictoriaW/article/details/75314737
首先看一段脚本:
>>>mystr='哈哈'
>>>mystr
'\xe5\x93\x88\xe5\x93\x88'#我用python2.7.16,str类型字符串在buffer缓存非ascii字符时自动进行unicode码——>UTF-8码的编码
>>>type(mystr)
延伸文章資訊
- 1python中將\\uxxxx轉換為Unicode字串的方法- IT閱讀
這篇文章主要介紹了python中將\\uxxxx轉換為Unicode字串的方法,小編覺得挺不錯的, ... return _compile(pattern, flags).sub(repl, s...
- 2瞭解Unicode — Python Tutorial 0.1 說明文件
與外界溝通- decode與encode¶. 在上面我們學到了如何表示unicode 字串,但是事實上是, unicode 字串只能存在程式的內部,並沒有 ...
- 3What's the u prefix in a Python string? - Stack Overflow
The u in u'Some String' means that your string is a Unicode string. Q: ...
- 4Python——str字符串和unicode字符串_Vic时代的博客
对于处理过中文的Python程序员来说,想必被UnicodeEncodeError和UnicodeDecodeError并不陌生。为了更好的理解Python中的编码问题,我们首先介绍一下 ...
- 5Python 中的原始字串和Unicode 字串 - Delft Stack
區分'u' 和'r' 字串標誌並瞭解原始字串文字在python 中的工作原理。