Python——str字符串和unicode字符串_Vic时代的博客

文章推薦指數: 80 %
投票人數:10人

对于处理过中文的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"",line1,in UnicodeEncodeError:'ascii'codeccan'tencodecharactersinposition0-1:ordinalnotinrange(128) 这是因为在把字符串写入文件时,会首先检查字符串的类型,如果是str类型的字符串,那么一切OK;如果是unicode类型的字符串,那么会隐式地对其编码,即x.encode()。

而系统默认的编码方案是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 usingnamespacestd; intmain() { std::stringzh_str="中文"; autos=zh_str.c_str(); autolen=zh_str.size(); for(inti=0;i",line1,in>>printord('A')65>>>printchr(65)A对于Unicode字符,注意仅接收长度为1的Unicode字符代码如下:>>>printord(u'\u54c8')21704>>&gt... python设置unicode编码_关于python中的unicode字符串的使用 weixin_39953236的博客 11-25 421 基于python2.7中的字符串:unicode——》编码encode('utf-8')——》写入文件读出文件——》解码decode('utf-8')——》unicode在使用unicode的时候,必须注意以下的原则:1、程序中出现字符串的地方加前缀u,表示为unicode类型2、不要使用str函数,在使用的时候使用unicode函数3、不要使用string模块4、只有在写入文件或者数据库或者网... Unicode字符串和非Unicode字符串 代码帮 07-30 6298 什么是Unicode? Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。

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)



請為這篇文章評分?