2014-01-17 48 views
0

采取以下Python代码,从而产生含有一个Unicode字符串的文本文件:Unicode文本在MS Word和Python

def writefile(): 
    out = u'x \u2208 \u22C3A \u2192 \u2203y(x \u2208 y \u2208 A)' 
    fout = open("output.txt",'w') 
    fout.write(out.encode('UTF-8')) 
    fout.close() 

# The string is: x ∈ ⋃A → ∃y(x ∈ y ∈ A) 

如果我使用重量轻的文本编辑器,如纳米(打开这个文件在终端中),TextWrangler或TextEdit,一切看起来都很好,但如果我尝试通过MS Word打开文件(Word for Mac 2011,v14.3.9),则所有的Unicode字符都会出现乱码。当打开文件时,Word会抛出一个询问“将文件转换为:”的对话框,但每种可用的转换方法似乎都会产生乱码。例如:

x ∈ ⋃A → ∃y(x ∈ y ∈ A) (opening as either UTF-8 or Mac OS (Default)) 
x ∈ ⋃A → ∃y(x ∈ y ∈ A) (opening as MS-DOS Text) 

然而,如果我打开该文件在例如TextWrangler,然后将该字符串复制到剪贴板,然后将其粘贴到MS Word中,它会正确显示该字符串。所以有两个问题:

1.)什么解释了这种行为?即Word没有正确显示文件的事实,以及在Word中打开文件与从另一个程序将其内容粘贴到Word中的区别。

2.)我该如何编写一个脚本(例如python),它接受上述utf-8文件并将其转换为单词可以读取/正确显示的内容?

回答

1
  1. 这是Microsoft Word的问题。写入的文件是正确的UTF-8,但Word正在读取它,就好像它使用Mac Roman编码一样。请注意,当您告诉Word使用“Unicode 6.1 UTF-8”导入时,预览不会更改。

  2. 试着写出它为UTF-16。我已经检查过MS Word可以正确读取一个big-endian的UTF-16文件。我认为只要将UTF-8更改为UTF-16应该可以工作,但对于投注结果,您可能需要试验UTF-15BE和UTF-16LE,并且还可以在开始时写出BOM(字节顺序标记)文件。

+1

谢谢,在Python脚本中使用'fout.write(out.encode('UTF-16'))'工作。 (Word默认打开output.txt文件,如Unicode 6.0(Little-Endian),正确显示)。但哇,这是一个恼人的错误。 –