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

#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字符的内容到variables

(源文件保存在utf-8中,但这应该没有什么区别,除非在源代码中实际上定义了unicodestring…正如你所看到的,unicodestring被dynamic地定义为一个variables..什么编码在这种情况下来源是不重要的)

  • 写入一个名称包含unicode字符的文件
  • 写入unicode内容到这个文件中

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

 c = req.read() 

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

然而,当我使用解码function时:

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

它不会打开文件错误(真正创build与'w'模式),并且生成的文件的名称将是可读的,现在它显示正确的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') 

但它也错误..

虽然winterTTR的答案确实有效。我意识到这种方法是错综复杂的。 相反,你真正需要做的是编码你写入文件的数据。 您不需要进行编码的名称,名称和内容都将显示为“可读”。

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

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

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