Tuesday, December 1, 2009

str, unicode

在python里, 这两种东西比较烦, 比如:

if 'author' == name:
这看上去没有什么大问题, 但是说不定就会出bug!, 最好是这样:
if 'author' == str(name) :

如果判断变量是否为字符串, 平时会写:
if type(name) == str:
最好的方法是:
if issubclass(type(name), basestring):

因为basestring是<type 'str'>和<type 'unicode'>的父类

还有:

full_name = first_name + last_name
看上去也没有什么大问题(使用acsii码时). 但是:
>>> a = '我'
>>> b = u'们'
>>> a + b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

这其实是编码问题:
>>> unicode('我')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 0: ordinal not in range(128)

编码应该是要知道的

unicode在python里得到unicode有两种方法:
1. u'xxxxx'
2. unicode('xxxxx')
这根据'xxxxx'的内容又分为:

1. 'xxxxx'为外码

文本文件中的 u'我'  这其实就是把'我'字的外码写到文件内.

这种情况下, python解释器把外码转成unicode是需要一个解码方式 这就是sha-bang line起作用的地方: python会使用sha-bang line指定的编码方式去把字符串转换成unicode对象

这种方法常常和下面的方法产生混淆:

>>> a = u'\xe6\x88\x91'
>>> print a
æ

为什么u'xxxx'中的外码出问题呢?
理论上, '\xe6\x88\x91' 和 '我' 对python解释器来说是一样的. 但是u'\xe6\x88\x91'表示了三个unicode字符! 分别是: u'\xe6, u'\x88, u'\x91'

其实: '\xe6\x88\x91'表达式和 '我' 表达式对python解释器来说是一样的, 但是后者明显比前者占用的硬盘空间少!

2. 'xxxxx'为内码

In [38]: print u'\u53F6'
-------> print(u'\u53F6')



unicode的方式比较直接: unicode(外码, 编码方式)

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.