我在Mac OS X 10.8.2上使用Python 2.7.2。我需要写一个.csv文件,其中通常包含几个"Umlauts"如ä, ö和ü。当我写。csv文件时,Numbers和Open Office都能正确读取csv,也能显示Umlauts,没有任何问题。
但是如果我在Microsoft Excel 2004中阅读的话单词是这样显示的:
TuÃàrlersee
我知道,Excel有问题处理UTF-8。我读到2007年以下的Excel版本不能正确读取UTF-8文件,即使你已经设置了UTF-8 BOM(字节顺序标记)。我用以下行设置UTF-8 BOM:
e.write(codecs.BOM_UTF8)
所以我下一步尝试的不是将其导出为UTF-8文件,而是将字符编码设置为mac-roman。在下面这行代码中,我将该值从utf-8解码,并用mac-roman重新编码。
projectName = projectDict['ProjectName'].decode('utf-8').encode('mac-roman')
但是我收到以下错误:
UnicodeEncodeError: 'charmap' codec can't encode character u'u0308' in position 6: character maps to <undefined>
我如何将此数据导出到Excel能够正确读取Umlauts的。csv ? Python内部处理所有UTF-8格式的内容。或者也许我没有正确理解解码/编码。在Python 3.0中,他们已经适应了整个编码/解码模型,但我需要留在2.7.2版本..
我是这样使用dictwwriter的:
w = csv.DictWriter(e, fieldnames=fieldnames, extrasaction='ignore', delimiter=';', quotechar='"', quoting=csv.QUOTE_NONNUMERIC)
w.writeheader()
u0308
为联合通气;在解码为mac-roman:
import unicodedata
unicodedata.normalize('NFC', projectDict['ProjectName'].decode('utf-8')).encode('mac-roman')
演示,将非规范化形式的ä
字符(a
+组合diaeresis)编码为规范化后的合成字符:
>>> unicodedata.normalize('NFC', u'au0308').encode('mac-roman')
'x8a'
我过去曾使用这种技术为特定的客户端生成CSV,这些客户端的平台编码是预先知道的(Excel将以当前的Windows编码IIRC解释文件)。在这种情况下,我编码为windows-1252
。
CSV文件实际上只意味着在ASCII -如果你正在做的只是写数据导入到Excel以后,那么我写它作为一个Excel工作簿开始,这将避免不得不与这种东西搞混。
查看http://www.python-excel.org/xlwt
模块