Python中文字符的理解:str()、repr()、print
来源:互联网 发布:it创业项目 编辑:程序博客网 时间:2024/06/07 19:22
转自:http://www.jianshu.com/p/43dd8f6a0247
都说Python人不把文字编码这块从头到尾、从古至今全研究通透的话是完全玩不转的。我终于深刻的理解到了。通宵了好几夜,各种试验,print、print再print,中文还是既得不到也输不出。
看了网上几乎所有主要的相关文章,还是没搞定。沉静下来开始反思:是他们写的不好,还是我理解的不好?所以我决定,再加深程度,一步一个脚印地研究这个问题,不忽略任何一个小细节的理解。先从字符串在Python中最基本的原理理解起。
首先说明一下,我的开发环境是:
python --version : 2.7OS: Windows 7 (32bit)IDE: Sublime3, IDLE, Windows cmd命令行
Python 字符串的存储
先看一段代码,这是在IDLE命令行中几个简单的交互:
>>> 'hello' 'hello' >>> print 'hello' hello >>> '你好' '\xc4\xe3\xba\xc3' >>> print '你好' 你好
(都知道在python的命令行里,直接输入一个变量会显示它的值,直接输入一个复杂对象会给你显示它的对象类型和内存地址)
从上面可以看出,变量时英文的话不管直接输入还是print结果都一样。可是为什么直接输入变量
和print变量
会显示不一样的东西呢?
原来,python 2系是绝对英文友好
的。中文对于它来说,只存储为一串编码而不是原文。\xc4\xe3\xba\xc3
这种东西对于中国python人来说是再熟悉不过的东西了,没事就蹦出来几次。最逗的是,我查了半天,\x$$
这种东西到底是什么编码,是utf-8还是gb2312?竟然没找到什么明确的说法,这个一会儿再说了。
话说回来,为什么'你好'
和print '你好'
结果会不一样呢?
在查看print
官方文档时发现,在python里面print是一个非常厉害的小家伙:它能把几乎任何常见类型的对象打印成一串文字,甚至包括列表、字典、元组等等。这在别的语言里是不可理解的,所以给从其他语言转过来的人埋了个大坑。
总结:Python中出现的任何中文,虽然我们在编辑器里看到的是中文,但是背地里全是一串编码。千万不要轻易信任print!print xx
给你显示出来的,其实并不是xx的真实面貌!
至于这个编码是什么格式,unicode还是utf-8之类,一会再说。
Python中的str()
和repr()
原生函数
好多人都知道str()能把123数字转成字符串,python里的str()甚至还能把列表、字典等对象转成字符串。这都好理解,可是一旦把str()
和repr()
放在一起,大家就全都不淡定了-_-!
来看一段代码,仍是在IDLE里交互:
>>> str('hello') 'hello' >>> repr('hello') "'hello'" >>> str('你好') '\xc4\xe3\xba\xc3' >>> repr('你好') "'\\xc4\\xe3\\xba\\xc3'"
先看前两句:英文的'hello'在str()后仍是'hello',可是在repr()后就变成了"'hello'"。这就说明,str()返回的就是字符串本身,而repr()虽然返回的也是字符串,但它是一个标准字符串
,官方解释比较绕,我来解释下吧。repr
是representation及描述的意思,不是对人的描述,而是对python机器的描述,也就是它会将某物返回一个它在python中的描述
。说人话:repr(obj)
告诉我们obj这个变量在背地里是什么样子,在背地里是怎么被python处理被python"玩弄"的。
在python里,我们总会被眼睛欺骗。编辑器里显示的东西,并不总是它原本的面貌。python为了方便,总是表面上一套,背地里又一套。
再来理解后两句:中文的'你好'在str()后变成了编码'\xc4\xe3\xba\xc3',在repr()后变成了"'\xc4\xe3\xba\xc3'"。`都加上了转移符变成
\,相当于把字符串中的内容都“标准化”了。至于
'变成
"`只是为了说明repr()返回的是一个经过处理的新字符串。
print后的str()和repr()
来看代码:
>>> print str('你好') 你好 >>> print repr('你好') '\xc4\xe3\xba\xc3'
之前str('你好')显示的是'\xc4\xe3\xba\xc3'
,而一经过print,就变成了正确的'你好'。上面说过了,命令行里直接输入一个变量,显示的是它在python后台存储的数据;而用print出来的东西,会显出出尽量友好、让人能看懂的东西。
理解了这个,对print这两个结果的不同,也就全然理解了。然后也就放弃print作为考据的心了。
另外,以上代码的交互,再windows系统cmd中,结果是一样的。
这样一来,python对字符串的基本理解就差不多了。这篇文章里尽量避免了对各种code编码的讨论,如unicode, ascii, ANSI, UTF-8, GB2312, GBK等等,是因为太复杂了。简单东西先理解,把基础先打牢,复杂的东西下一篇再研究。
原文链接:http://www.jianshu.com/p/43dd8f6a0247
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
- Python中文字符的理解:str()、repr()、print
- python print str repr pprint
- Python repr() str() print %r
- python中的字符输出(str()、repr()、print)
- Python的str()和repr()
- Python 字符处理方法:str, repr区别
- repr() , print () str
- 区别python 的str和repr
- python之repr()和str()的区别
- Python 的repr() 和str() 函数
- 飘逸的python - str vs. repr
- python 的repr和str以及“”
- python之repr()和str()的区别
- python 中 str() 与 repr() 的区别
- 学习Python:repr和str的区分
- python中repr和 str的异同
- python中str()与repr()的区别
- python str和repr 的区别
- 关于SIGCHLD信号的处理
- WPF视图绑定的Model类的优雅实现
- android_自定义控件第一炮
- LoadRunner 技巧之 脚本设计
- Curl的两个常用函数
- Python中文字符的理解:str()、repr()、print
- Android开发之http协议解析
- drupal 学习笔记一 安装docker or drupal
- MFC中ON_COMMAND, ON_MESSAGE, ON_NOTIFY它们的区别(转载
- 23种设计模式全解析
- cocos2d-x 3.2,Label,Action,Listener,Menu Item等简单用法
- Android-删除联系人
- C语言中结构体指针的定义和引用
- eclipse调试系统应用,如何制作签名