URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 7 » Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
 
 
 
 
 
 
 
 
 
Subject: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: jhuangjiahua    Posted: 2005-08-26 21:24    Length: 733 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]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: limodou    Posted: 2005-08-26 21:55    Length: 165 byte(s)
[Original] [Print] [Top]
这是与操作系统有关。因为我们的操作系统缺省编码并不是unicode,你可以在sys.defaultsysencoding查出来。如果与它不一致,是要进行转换的。因此不是简单地想存什么就存什么的。
----
[Original] [Print] [Top]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: jhuangjiahua    Posted: 2005-08-26 22:37    Length: 1,243 byte(s)
[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]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: jhuangjiahua    Posted: 2005-08-26 22:40    Length: 817 byte(s)
[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]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: jhuangjiahua    Posted: 2005-08-26 22:53    Length: 917 byte(s)
[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]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: passworld    Posted: 2005-08-26 23:16    Length: 999 byte(s)
[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]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: jhuangjiahua    Posted: 2005-08-26 23:28    Length: 901 byte(s)
[Original] [Print] [Top]
谢谢解说 :)


不过我刚才那样保存的文本里 4 个字用了 10 个字节,有 Bom 位
hua@hua:sh$ zhtounicode.py < test.uni
你好啊!
encc: unk
hua@hua:sh$ ls -l test.uni
-rw-r--r-- 1 hua hua 10 2005-08-26 22:25 test.uni
hua@hua:sh$
hua@hua:sh$ xxd < test.uni
0000000: fffe 604f 7d59 4a55 01ff ..`O}YJU..
hua@hua:sh$



而 <你> 20320, Hex 4f60, Octal 47540

这么说,还是直接指定 utf32 或 utf16 好了


[Original] [Print] [Top]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: passworld    Posted: 2005-08-27 01:12    Length: 206 byte(s)
[Original] [Print] [Top]
有BOM的话会不会每次写入unicode字串都会加一个BOM进去?如果这样就比较难看了,那么指定UTF32LE或者UTF32BE会比较好,或者一次过把所有的内容写入。如果只是第一次写入加BOM当然没有问题,但不太应该这样实现。
----
[Original] [Print] [Top]
Subject: Re: Q: 把 unicode 文本写入文件就出错 , 怎么回事啊
Author: jhuangjiahua    Posted: 2005-08-27 11:49    Length: 121 byte(s)
[Original] [Print] [Top]
是不是说,如果这 unicode 只是作为一个数据类型
那有 Bom 也无所谓了

保存时指定 utf32 或其它就行
[Original] [Print] [Top]
« Previous thread
如何读取这个文件?
Python 编 程
7
Next thread »
请教关于Python的两个问题?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:11:05, cost 0.067574024200439 ms.