Python中文字符的理解:str()、repr()、print

字数1384 阅读4 评论0 喜欢0

都说Python人不把文字编码这块从头到尾、从古至今全研究通透的话是完全玩不转的。我终于深刻的理解到了。通宵了好几夜,各种试验,print、print再print,中文还是既得不到也输不出。
看了网上几乎所有主要的相关文章,还是没搞定。沉静下来开始反思:是他们写的不好,还是我理解的不好?所以我决定,再加深程度,一步一个脚印地研究这个问题,不忽略任何一个小细节的理解。先从字符串在Python中最基本的原理理解起。
首先说明一下,我的开发环境是:

python --version : 2.7
OS: 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等等,是因为太复杂了。简单东西先理解,把基础先打牢,复杂的东西下一篇再研究。

Python中文字符的理解:str()、repr()、print的更多相关文章

  1. 【已解决】python中文字符乱码(GB2312,GBK,GB18030相关的问题)

      http://againinput4.blog.163.com/blog/static/1727994912011111011432810/ [已解决]python中文字符乱码(GB2312,GB ...

  2. python 中文字符的处理

    刚开始学习python的时候,都是对这英文的翻译书学习的.没有解除到中文编码的相关问题,直到自己用python去做相关的项目的时候才发先中文编码问题真的非常头疼啊.这里分享一下本人所了解的一些经验. ...

  3. python中文字符乱码(GB2312,GBK,GB18030相关的问题)

    转自博主 crifan http://againinput4.blog.163.com/blog/static/1727994912011111011432810/ 在玩wordpress的一个博客搬 ...

  4. Python中文字符问题

    Python中对中文字符的操作时常会使程序出现乱码 不全然管用的处理方法: 读取数据时使用encode编码为Bytes以保护数据 使用时转化为string并使用decode解码 如: title = ...

  5. JavaScript中文字符验证的函数/正则

    /** * 中文字符验证 * @param {} str * @return {Boolean} */ function checkChinese(str) { var re = /[^\u4e00- ...

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

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

  7. python处理中文字符

    1.在py文件中使用中文字符 unicode.py文件内容如下所示: # -*- coding:utf-8 -*- str_ch = '我们women' uni_ch = u'我们women' pri ...

  8. python利用utf-8编码判断中文字符

    下面这个小工具包含了 判断unicode是否是汉字,数字,英文,或者其他字符. 全角符号转半角符号. unicode字符串归一化等工作. 还有一个能处理多音字的汉字转拼音的程序,还在整理中. #!/u ...

  9. 处理python字符串中的中文字符

    # -*- coding:utf-8 -*- import sys,os txta = open('a.txt','r') str = '' for line in txta: str += line ...

随机推荐

  1. 深入剖析MFC中对于Windows消息处理、运行机制

    序: 本人对Windows系统.MFC谈不上有深入的了解,但对MFC本身包装API的机制很有兴趣,特别是读了候老师的<深入浅出MFC>后,感觉到VISUAL C++的Application ...

  2. linux之SQL语句简明教程---IN

    在 SQL 中,在两个情况下会用到 IN 这个指令:这一页将介绍其中之一 -- 与 WHERE 有关的那一个情况.在这个用法下,我们事先已知道至少一个我们需要的值,而我们将这些知道的值都放入IN 这个 ...

  3. openstack 使用cloud init 和 console-log, nbd或者libguestfs 获取VM中的硬件信息。

    以获取PCI的信息为例. 基本代码: pci.py import base64 import guestfs from functools import partial import os impor ...

  4. 滚动视差效果——background-attachment

    滚动视差效果的实现原理是在同一个页面上将页面元素分为多层,例如可以分为背景.内容.贴图层,在滚动页面的时候让三者滚动的速度不一,从而在人的视觉上能够形成一种立体的近似效果.最近在做一个项目wiki的时 ...

  5. iOS 自我检測

    1.id 和 NSObject的差别? 2.UITableViewCell的复用原理? 3.UIView生命周期和UILayer的差别? 4.多线程NSOperation和Queue.GDC.Thre ...

  6. 依赖注入及AOP简述(九)——单例和无状态Scope .

    三.依赖注入对象的Scope及其生命周期 在前面的章节我们讲到,依赖注入容器之所以能够区别于以往的ServiceLocator等容器,是在于其不但能够自动构建多层次的.完整的依赖关系图,并且可以管理依 ...

  7. HTML 基础 2

    1. 认识CSS样式: CSS:层叠样式表(Cascading Style Sheets),主要用于定义HTML内容在浏览器内的显示样式 语法: 选择符{ 属性: 值} 举例: p{ color: b ...

  8. C# DropDownList绑定文件夹

    首先创建一个类,类名称为FileControl, /// <summary> /// 获取制定文件夹下面的文件夹 /// </summary> /// <param na ...

  9. UVA1600 Patrol Robot

    题意: 求机器人走最短路线,而且可以穿越障碍.N代表有N行,M代表最多能一次跨过多少个障碍. 分析: bfs()搜索,把访问状态数组改成了3维的,加了个维是当前能跨过的障碍数. 代码: #includ ...

  10. juce中的Singleton

    说明上其实很明白,支持多线程,防止重复创建,同时支持如果删除以后就不在创建,利用局部静态变量进行标记.挺通用,看来下次写个c11版本的 //============================== ...