|
|
|
|
| Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 |
 Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - jhuangjiahua [ 2005-08-26 21:24 | 733 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - limodou [ 2005-08-26 21:55 | 165 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - jhuangjiahua [ 2005-08-26 22:40 | 817 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - jhuangjiahua [ 2005-08-26 22:53 | 917 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - jhuangjiahua [ 2005-08-26 22:37 | 1,243 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - passworld [ 2005-08-26 23:16 | 999 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - jhuangjiahua [ 2005-08-26 23:28 | 901 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - passworld [ 2005-08-27 01:12 | 206 byte(s)]
 Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊 - jhuangjiahua [ 2005-08-27 11:49 | 121 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
>>> f=open('tsee','w')
>>> s=unicode('你好啊!','utf8')
>>> print s
你好啊!
>>> type(s)
<type 'unicode'>
>>> f.write(s)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
>>>
>>> f.write('你好啊')
>>>
直接写 UTF-8 文本就可以,转成 unicode 就出错
怎么回事啊
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
这是与操作系统有关。因为我们的操作系统缺省编码并不是unicode,你可以在sys.defaultsysencoding查出来。如果与它不一致,是要进行转换的。因此不是简单地想存什么就存什么的。
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
那, 如果要保存 unicode 编码的文本,改怎么做啊
另外, ipython 里没法 sys.defaultsysencoding 呀
In [1]: import sys
In [2]: sys.getdefaultencoding()
Out[2]: 'ascii'
In [3]: sys.defaultsysencoding
---------------------------------------------------------------------------
exceptions.AttributeError Traceback (most recent call last)
/home/hua/tmp/sh/<console>
AttributeError: 'module' object has no attribute 'defaultsysencoding'
In [4]:
>>> import sys
>>> sys.defaultsysencoding
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'defaultsysencoding'
>>> sys.getdefaultencoding
<built-in function getdefaultencoding>
>>> sys.getdefaultencoding()
'ascii'
>>>
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
Python 手册里看到这个
获得/设置系统的缺省编码
sys.getdefaultencoding()
sys.setdefaultencoding('utf-8')
可是,
>>> sys.setdefaultencoding('utf-8')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>>
In [1]: import sys
In [2]: sys.s
sys.setappdefaultencoding sys.setprofile sys.stderr
sys.setcheckinterval sys.setrecursionlimit sys.stdin
sys.setdlopenflags sys.settrace sys.stdout
In [2]: sys.s
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
用了这个 sys.setappdefaultencoding('unicode')
可以了...
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.setappdefaultencoding('unicode')
>>> sys.getdefaultencoding()
'unicode'
>>> f=open('test.uni','w')
>>> s=unicode('你好啊!','utf8')
>>> s
u'u4f60u597du554auff01'
>>> f.write(s)
>>> f.close()
>>>
>>>
>>> f=open('test.uni')
>>> ss=f.read()
>>> print ss.encode('utf8')
你好啊
>>>
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
Python 的所谓 unicode 是指它对 unicode 的一种支持,是一种内码表现形式,表明它的每一个字符对应一个统一码内定义的字,它本身是怎么在python内部实现外面是看不见的,未必就真是使用ucs4或者utf32,当输出到文件里时会经过解码到一种用户系统预定的编码的。当你系统的预定编码不能包括转换时需要的字集时,就会出错。
至于存unicode,应该使用非unicode字符串,这时候的字符串是一个简单的字节串,没有编码,所以不需要转换,直接存入。你说怎么存unicode,你的unicode是什么编码的?没有编码的统一码只是一个字符集,也就是说所有所有字的形状的一个集合,只有以某一种编码表示后,在计算机里才有具体的意义。所以说UTF-8也是统一码,UCS4, UTF16, UTF32都是一种统一码。
所以你如果要存UTF16,先转成 utf16 然后再写入:
s = s.decode('utf16')
f.write(s)
当然如果你希望的是 ucs4, ucs2, utf32 ... 一样先转码,再写入。hmm... python 好象预设不支持 ucs4,ucs2,utf32。不过它好象有 'unicode_internal',参看参考手册 codecs 部分,其实就是 UTF-32LE。
|
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
有BOM的话会不会每次写入unicode字串都会加一个BOM进去?如果这样就比较难看了,那么指定UTF32LE或者UTF32BE会比较好,或者一次过把所有的内容写入。如果只是第一次写入加BOM当然没有问题,但不太应该这样实现。
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
|