比这篇新的文章:
Codee#2381
比这篇旧的文章: Codee#2379
作者: 半瓶墨水, 点击332次, 评论(0), 收藏者(0), , 打分:
所有评论,共0条:( 我也来说两句)
比这篇旧的文章: Codee#2379
Python中文编码的问题zz
语言: Python console session, 标签: 无 2009/06/23发布 8个月前更新作者: 半瓶墨水, 点击332次, 评论(0), 收藏者(0), , 打分:
Python console session语言: Python中文编码的问题zz
01 >>> print repr(u"吴".encode("gb18030"))
02 '\xce\xe2'
03 这说明你看到的是汉字或者乱码,而python看到的是一个上面这两个字节的字符串对象。
04 对于python2.5而言,字符类型就两种,str和unicode。
05 而不是100多种,上面这个是什么类型?
06 >>> type('\xce\xe2')
07 <type 'str'>
08 >>> type('\xce')
09 <type 'str'>
10 这说明啥?这个字符串显然是str不是unicode.那长度呢
11 >>> len('\xce')
12 1
13 >>> len('\xe2')
14 1
15 >>> len('\xce\xe2')
16 2
17 这是很显然的,对不对,对python而言,他并不知道你这两个字节的东西是个汉字,
18 他也不知道你这个东西是个什么编码格式的,它只知道这是两个字符长度的str。
19 同样的:
20 >>> print repr(u"吴".encode("utf8"))
21 '\xe5\x90\xb4'
22 >>> print type(u"吴".encode("utf8"))
23 <type 'str'>
24 这说明utf8编码后的这个字符串是3个字符长度的str,对不对?
25 python并不会给你100多种编码的字符每个给你一个类型,比如utf8的叫utf8str,
26 gb18030的叫gb18030str,不会,他们都是一种类型:str,所以,上面两种编码的字符,
27 对于python而言,只是'\xce\xe2'和'\xe5\x90\xb4'的区别。
28 >>> print repr(u"吴")
29 u'\u5434'
30 看到了吧,这次是这样一个字符
31 >>> print type(u"吴")
32 <type 'unicode'>
33 这说明这是个unicode类型了,并且,这个unicode类型的对象的长度是1
34 现在明白了吧,对你来讲,字符之间的差别是编码方式,对python来讲,差别是类型。
35 它只是给你提供了一些转换编码的方法,但不同的只有两种类型。
36
37 第二个问题:
38 >>> help(id)
39 Return the identity of an object. This is guaranteed to be unique among
40 simultaneously existing objects. (Hint: it's the object's memory address.)
41 人家说的很明白了,返回的是object的内存地址,同时存在的对象之间是独立的。
42 你用u"吴"的时候,和你用"吴".decode("utf8")的时候的"吴",对于python而言,
43 理论上时独立的,因为这是两次执行过程,并没有什么相关性,完全可以理解为
44 这是两个object,只是这两个str的值一样罢了,python并不保证两个值一样的object
45 就放在同一个内存地址内。
46 当然了,对于某些类型的对象,比如小int和简单ascii str,python为了优化,
47 会使用同样的内存地址存同样的值,但这并不保证。所以尽量不要去考虑这个。
48 你大可以认为,同一个生产线出来的轮子,长的再一样,它也是两个轮子,放在不同的
49 位置,占用不同的空间。
50 所以:
51 >>> id(u"吴")
52 11577488
53 >>> id(u"吴")
54 11577776
55 >>> id("吴")
56 13245696
57 >>> id("吴")
58 13650880
59 >>> id("吴")
60 13304864
61 >>> id("吴")
62 13245696
63 至于"=="的判断,这个并不是根据"=="的统一定义来的,而是根据每个不同的类型对于
64 __eq__ 这样的method的实现来的。所以并不一定说id一样就True,或者值一样就True
65 比如str类型,python对"__eq__"的定义是内容(也就是值)相同就返回True
66 所以才会有:
67 >>> a = '吴'
68 >>> b = '吴'
69 >>> a
70 '\xce\xe2'
71 >>> b
72 '\xce\xe2'
73 >>> id(a)
74 13745216
75 >>> id(b)
76 13743232
77 >>> id(a) == id(b)
78 False
79 >>> a == b
80 True
81 而对于基类object而言,"__eq__"就很简单了,id不同就不同
82 >>> x = object()
83 >>> y = object()
84 >>> x == y
85 False
86 >>> x
87 <object object at 0x00B20468>
88 >>> y
89 <object object at 0x00B20470>
02 '\xce\xe2'
03 这说明你看到的是汉字或者乱码,而python看到的是一个上面这两个字节的字符串对象。
04 对于python2.5而言,字符类型就两种,str和unicode。
05 而不是100多种,上面这个是什么类型?
06 >>> type('\xce\xe2')
07 <type 'str'>
08 >>> type('\xce')
09 <type 'str'>
10 这说明啥?这个字符串显然是str不是unicode.那长度呢
11 >>> len('\xce')
12 1
13 >>> len('\xe2')
14 1
15 >>> len('\xce\xe2')
16 2
17 这是很显然的,对不对,对python而言,他并不知道你这两个字节的东西是个汉字,
18 他也不知道你这个东西是个什么编码格式的,它只知道这是两个字符长度的str。
19 同样的:
20 >>> print repr(u"吴".encode("utf8"))
21 '\xe5\x90\xb4'
22 >>> print type(u"吴".encode("utf8"))
23 <type 'str'>
24 这说明utf8编码后的这个字符串是3个字符长度的str,对不对?
25 python并不会给你100多种编码的字符每个给你一个类型,比如utf8的叫utf8str,
26 gb18030的叫gb18030str,不会,他们都是一种类型:str,所以,上面两种编码的字符,
27 对于python而言,只是'\xce\xe2'和'\xe5\x90\xb4'的区别。
28 >>> print repr(u"吴")
29 u'\u5434'
30 看到了吧,这次是这样一个字符
31 >>> print type(u"吴")
32 <type 'unicode'>
33 这说明这是个unicode类型了,并且,这个unicode类型的对象的长度是1
34 现在明白了吧,对你来讲,字符之间的差别是编码方式,对python来讲,差别是类型。
35 它只是给你提供了一些转换编码的方法,但不同的只有两种类型。
36
37 第二个问题:
38 >>> help(id)
39 Return the identity of an object. This is guaranteed to be unique among
40 simultaneously existing objects. (Hint: it's the object's memory address.)
41 人家说的很明白了,返回的是object的内存地址,同时存在的对象之间是独立的。
42 你用u"吴"的时候,和你用"吴".decode("utf8")的时候的"吴",对于python而言,
43 理论上时独立的,因为这是两次执行过程,并没有什么相关性,完全可以理解为
44 这是两个object,只是这两个str的值一样罢了,python并不保证两个值一样的object
45 就放在同一个内存地址内。
46 当然了,对于某些类型的对象,比如小int和简单ascii str,python为了优化,
47 会使用同样的内存地址存同样的值,但这并不保证。所以尽量不要去考虑这个。
48 你大可以认为,同一个生产线出来的轮子,长的再一样,它也是两个轮子,放在不同的
49 位置,占用不同的空间。
50 所以:
51 >>> id(u"吴")
52 11577488
53 >>> id(u"吴")
54 11577776
55 >>> id("吴")
56 13245696
57 >>> id("吴")
58 13650880
59 >>> id("吴")
60 13304864
61 >>> id("吴")
62 13245696
63 至于"=="的判断,这个并不是根据"=="的统一定义来的,而是根据每个不同的类型对于
64 __eq__ 这样的method的实现来的。所以并不一定说id一样就True,或者值一样就True
65 比如str类型,python对"__eq__"的定义是内容(也就是值)相同就返回True
66 所以才会有:
67 >>> a = '吴'
68 >>> b = '吴'
69 >>> a
70 '\xce\xe2'
71 >>> b
72 '\xce\xe2'
73 >>> id(a)
74 13745216
75 >>> id(b)
76 13743232
77 >>> id(a) == id(b)
78 False
79 >>> a == b
80 True
81 而对于基类object而言,"__eq__"就很简单了,id不同就不同
82 >>> x = object()
83 >>> y = object()
84 >>> x == y
85 False
86 >>> x
87 <object object at 0x00B20468>
88 >>> y
89 <object object at 0x00B20470>
所有评论,共0条:( 我也来说两句)
代码
