在Windows中编写unicode内容和unicode文件名

时间:2011-06-08 05:45:56

标签: python windows

#source file is encoded in utf8
import urllib2
import re

req = urllib2.urlopen('http://people.w3.org/rishida/scripts/samples/hungarian.html')
c = req.read()#.decode('utf-8')

p = r'title="This is Latin script \(Hungarian language\)">(.+)'
text = re.search(p, c).group(1)

name = text[:10]+'.txt'  #file name will have special chars in it

f = open(name, 'wb')
f.write(text)  #content of file will have special chars in it
f.close()   


x = raw_input('done')

正如您所看到的,脚本可以执行以下操作: - 将已知具有网页中的unicode字符的内容读入变量

(源文件保存在utf-8中,但除非在源代码中实际定义了unicode字符串,否则这应该没有区别......正如您所看到的那样,unicode字符串被动态地定义为变量..在这种情况下,源代码的编码应该无关紧要)

  • 写入名称包含unicode字符的文件
  • 也将unicode内容写入此文件

这是我得到的奇怪行为(Windows 7,Python 2.7): 当我不使用解码功能时:

c = req.read()

该文件的名称会出现乱码,但文件的内容将可读(即你可以看到正确的unicode匈牙利字符)

然而,当我使用解码功能时:

c = req.read().decode('utf-8')

打开文件时不会出错(实际上是以'w'模式创建) 并且生成的文件的NAME将是可读的,是的,它现在显示正确的unicode字符。

到目前为止这么好吗? 那么,在尝试将unicode内容写入文件时会出错:

    f.write(text)  #content of file will have special chars in it
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 8: ordinal not in range(128)

你看,我似乎没有蛋糕,也吃了它... 要么我能正确写出文件的名称,要么我可以正确地写出文件的内容..

我该怎么做?

我也尝试用

编写文件
f = codecs.open(name, encoding='utf-8', mode='wb')

但它也有错误..

2 个答案:

答案 0 :(得分:4)

您遇到的唯一问题似乎只是原始源文件中的“不可读”文件名。这可以解决您的问题:

f = open(name.decode('utf-8').encode( sys.getfilesystemencoding() ) , 'wb')

答案 1 :(得分:4)

虽然winterTTR的答案确实有效但我已经意识到这种方法很复杂。 相反,您真正需要做的就是编写您写入文件的数据。您不需要编码的名称,名称和内容都将显示出来,并且“可读”#34;。

content = '\xunicode chars'.decode('utf-8')
f = open(content[:5]+'.txt', 'wb')
f.write(content.encode('utf-8'))
f.close()