我在 Mac OS X 10.8.2 上使用 Python 2.7.2 。 我需要写一个.csv文件,它经常包含几个“变形金刚”,如ä,ö和ü。当我写.csv文件时,Numbers和Open Office都能正确读取csv显示变音符号没有任何问题。
但是,如果我用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>
如何将此数据导出到.csv中,Excel能够正确读取变音符号? Python内部处理UTF-8中的所有内容。或者我可能没有正确理解解码/编码。在Python 3.0中,他们已经调整了整个编码/解码模型,但我需要保留2.7.2版本。
我正在使用DictWriter:
w = csv.DictWriter(e, fieldnames=fieldnames, extrasaction='ignore', delimiter=';', quotechar='\"', quoting=csv.QUOTE_NONNUMERIC)
w.writeheader()
答案 0 :(得分:7)
\u0308
是结合分音符;在解码为mac-roman之前你需要normalize your unicode string:
import unicodedata
unicodedata.normalize('NFC', projectDict['ProjectName'].decode('utf-8')).encode('mac-roman')
演示,在归一化为组合字符后,以非规范化形式(ä
加组合分音符)将a
字符编码为mac-roman:
>>> unicodedata.normalize('NFC', u'a\u0308').encode('mac-roman')
'\x8a'
我过去曾使用过这种技术为特定客户端生成CSV for Excel,他们的平台编码是预先知道的(Excel会解释当前Windows编码中的文件,IIRC)。在那种情况下,我编码为windows-1252
。
答案 1 :(得分:0)
CSV文件实际上只是用ASCII格式 - 如果你以后只是写出数据以便以后导入Excel,那么我就把它写成一个Excel工作簿来开始避免不得不用这种东西捣乱。
检查xlwt
模块的http://www.python-excel.org/。