Python中 u'吴'和'吴'有什么区别?
2009-04-27 00:20
这是我在水木问的一个问题
【 在 wuyeguo (风中飘絮) 的大作中提到: 】 : 被Python的字符编码给搞糊涂了 : 下面是我做的一些测试 : >>> len("吴".decode("utf8").encode("gb18030")) : 2 : >>> len("吴".decode("utf8").encode("utf8")) : 3 : >>> len("吴".decode("utf8")) : 1 : 上面的长度,是什么导致的呢? : >>> a = u"吴" : >>> b = "吴".decode("utf8") : >>> id(a) : 3085915248L : >>> id(b) : 3085916040L : 这里为什么a和b的id不一样呢? : >>> a : u'\u5434' : >>> b : u'\u5434' : >>> a == b : True : >>> e="a" : >>> f="a" : >>> id(e) : 3086135712L : >>> id(f) : 3086135712L : >>> g=u"吴" : >>> id(g) : 3085916136L : >>> h=u"吴" : >>> id(h) : 3085916208L : >>> hash(g) : 1807260213 : >>> hash(h) : 1807260213 : >>> hash(e) : -468864544 : >>> hash(f) : -468864544 : 环境 : Python 2.5.1 (r251:54863, Sep 17 2007, 02:13:54) : [GCC 4.1.1 20070105 (Red Hat 4.1.1-52)] on linux2 : 谢谢
下面是水木的xxxss同学的精彩回答
>>> print repr(u"吴".encode("gb18030")) '\xce\xe2'
这说明你看到的是汉字或者乱码,而python看到的是一个上面这两个字节的字符串对象。 对于python2.5而言,字符类型就两种,str和unicode。 而不是100多种,上面这个是什么类型?
>>> type('\xce\xe2') <type 'str'> >>> type('\xce') <type 'str'>
这说明啥?这个字符串显然是str不是unicode.那长度呢 >>> len('\xce') 1 >>> len('\xe2') 1 >>> len('\xce\xe2') 2
这是很显然的,对不对,对python而言,他并不知道你这两个字节的东西是个汉字, 他也不知道你这个东西是个什么编码格式的,它只知道这是两个字符长度的str。 同样的:
>>> print repr(u"吴".encode("utf8")) '\xe5\x90\xb4' >>> print type(u"吴".encode("utf8")) <type 'str'>
这说明utf8编码后的这个字符串是3个字符长度的str,对不对? python并不会给你100多种编码的字符每个给你一个类型,比如utf8的叫utf8str, gb18030的叫gb18030str,不会,他们都是一种类型:str,所以,上面两种编码的字符, 对于python而言,只是'\xce\xe2'和'\xe5\x90\xb4'的区别。
>>> print repr(u"吴") u'\u5434'
看到了吧,这次是这样一个字符 >>> print type(u"吴") <type 'unicode'>
这说明这是个unicode类型了,并且,这个unicode类型的对象的长度是1
现在明白了吧,对你来讲,字符之间的差别是编码方式,对python来讲,差别是类型。 它只是给你提供了一些转换编码的方法,但不同的只有两种类型。
第二个问题: >>> help(id) Return the identity of an object. This is guaranteed to be unique among simultaneously existing objects. (Hint: it's the object's memory address.)
人家说的很明白了,返回的是object的内存地址,同时存在的对象之间是独立的。 你用u"吴"的时候,和你用"吴".decode("utf8")的时候的"吴",对于python而言, 理论上时独立的,因为这是两次执行过程,并没有什么相关性,完全可以理解为 这是两个object,只是这两个str的值一样罢了,python并不保证两个值一样的object 就放在同一个内存地址内。 当然了,对于某些类型的对象,比如小int和简单ascii str,python为了优化, 会使用同样的内存地址存同样的值,但这并不保证。所以尽量不要去考虑这个。 你大可以认为,同一个生产线出来的轮子,长的再一样,它也是两个轮子,放在不同的 位置,占用不同的空间。 所以: >>> id(u"吴") 11577488 >>> id(u"吴") 11577776 >>> id("吴") 13245696 >>> id("吴") 13650880 >>> id("吴") 13304864 >>> id("吴") 13245696
至于"=="的判断,这个并不是根据"=="的统一定义来的,而是根据每个不同的类型对于 __eq__ 这样的method的实现来的。所以并不一定说id一样就True,或者值一样就True 比如str类型,python对"__eq__"的定义是内容(也就是值)相同就返回True 所以才会有: >>> a = '吴' >>> b = '吴' >>> a '\xce\xe2' >>> b '\xce\xe2' >>> id(a) 13745216 >>> id(b) 13743232 >>> id(a) == id(b) False >>> a == b True
而对于基类object而言,"__eq__"就很简单了,id不同就不同 >>> x = object() >>> y = object() >>> x == y False >>> x <object object at 0x00B20468> >>> y <object object at 0x00B20470>
|
分享到:
相关推荐
**Python字符编码检测库PyCharlockHolmes** Python在处理文本数据时,字符编码是一个重要的概念,因为不同的文件和数据源可能使用了不同的字符编码方式。PyCharlockHolmes是豆瓣公司开发的一个开源项目,旨在解决...
算术编码是一种高效的数据压缩方法,它在信息技术和数据传输领域有着广泛的应用。在这个Python实现中,我们将深入探讨算术编码的基本原理、Python编程实现的关键步骤以及如何进行编码和解码。 1. **算术编码的基本...
在信息论中,它利用字符出现的频率来构造一棵二叉树,进而为每个字符分配唯一的二进制码,使得频率高的字符编码长度短,频率低的字符编码长度长,从而达到压缩数据的目的。这种方法能够实现最优的前缀编码,即没有两...
python培训期间笔记,对数字类型,字符串等数据类型有详细介绍,其中还有字符编码部分,无废话版
本文实例为大家分享了python实现字符串加密成纯数字的具体代码,供大家参考,具体内容如下 说明: 该加密算法仅仅是做一个简单的加密,安全性就不谈了,哈哈. 算法流程: 1.字符串以utf8编码成字节数组 2.把每一个...
### Python3字符串详解 #### 一、字符串简介 在Python3中,字符串是最常用的数据类型之一,用于存储一系列字符。字符串可以通过单引号('')或双引号("")创建。例如: ```python var1 = 'HelloWorld!' var2 = ...
C语言字符串转换为Python字符串的方法 C语言字符串转换为Python字符串是指将...C语言字符串转换为Python字符串需要根据不同的编码方式和数据类型选择合适的方法,以确保正确地将C语言字符串转换为Python字符串对象。
Chardet 是一款通用的Python 2/3字符编码检测器。 支持 ASCII、UTF-8、UTF-16(2种变体)、UTF-32(4种变体) Big5、GB2312、EUC-TW、HZ-GB-2312。
### Python字符编码与中文乱码问题详解 #### 一、引言 在处理中文文本时,经常遇到的一个问题是中文乱码。特别是在使用Python进行开发时,由于不同的操作系统默认编码方式不同,以及Python自身对源文件编码的处理...
用python2的小伙伴肯定会遇到字符编码的问题。下面对编码问题做个简单的总结,希望对各位有些帮助。 故事零:编码的定义 我们从“SOS“(国际通用求助信号)开始,它的摩斯密码的编码是: “…—…”,想一下为...
Python PEP8 编码规范中文版旨在为Python编程语言提供一套统一的代码编写标准,以便提升代码的可读性和一致性。PEP是Python Enhancement Proposal的缩写,它代表了Python增强提案,而PEP8是一份专门针对Python代码...
这篇13页的PDF文档,"Python之字符串和编码",很可能深入探讨了Python中的字符串对象以及如何处理不同的字符编码。 在Python中,字符串是不可变的序列,由Unicode字符组成。它们可以用来存储和操作任何文本信息,从...
总之,彻底搞懂Python字符编码不仅有助于解决编程中的实际问题,还能帮助我们更好地理解计算机如何存储和处理文本信息,这对于任何级别的Python开发者来说都是非常有价值的。通过学习这些基础知识,我们可以更有效地...
Unicode是一种通用的字符编码标准,旨在涵盖世界上几乎所有的字符。了解这些差异对于编写跨平台、兼容不同语言的代码至关重要。 在Python2中,有两种类型的字符串:普通字符串(str)和Unicode字符串(unicode)。...
在Python编程语言中,统计字符串中的中英文字符、空格、数字和标点符号是一项常见的任务,这在数据...这个过程涉及了Python基础语法、字符串操作、Unicode编码以及文件读写等多个知识点,对于初学者来说是很好的练习。
本压缩包中的资源主要关注三种无失真编码方法:香农编码、费诺编码和霍夫曼编码,这些都是基于Python实现的。这三种编码方式都是为了降低数据的熵,从而达到压缩信息的目的。 1. **香农编码**: 香农编码是由信息论...
Python字符编码是编程中至关重要的一个概念,尤其是在处理文本数据时。在计算机内存中,所有字符通常以Unicode编码表示,这是国际通用的标准字符集,包含了世界上几乎所有的字符。而在操作系统层面,比如中国的...
霍夫曼(David Huffman)编码是一种变长的前缀编码方法,它基于字符出现频率进行编码。在图像处理中,不同颜色或灰度值的像素出现的频率通常不均等,霍夫曼编码利用这一特性,频繁出现的像素值用较短的编码,不常...