Pri*_*ine 2 python csv excel encoding utf-8
我在Mac OS X 10.8.2上使用Python 2.7.2.我需要写一个.csv文件,它通常包含几个像ä,ö和ü这样的"变形金刚".当我写.csv文件时,Numbers和Open Office都能正确读取csv并显示Umlauts而没有任何问题.
但是,如果我用Microsoft Excel 2004阅读它,那么单词显示如下:
TuÃàrlersee
Run Code Online (Sandbox Code Playgroud)
我知道,Excel在处理UTF-8时遇到了问题.我读到了2007年以下的Excel版本无法正确读取UTF-8文件的内容,即使您已经设置了UTF-8 BOM(字节顺序标记).我正在使用以下行设置UTF-8 BOM:
e.write(codecs.BOM_UTF8)
Run Code Online (Sandbox Code Playgroud)
所以我尝试下一步而不是将其作为UTF-8文件导出我想将字符编码设置为mac-roman.使用以下行我从utf-8解码了值并用mac-roman重新编码.
projectName = projectDict['ProjectName'].decode('utf-8').encode('mac-roman')
Run Code Online (Sandbox Code Playgroud)
但后来我收到以下错误:
UnicodeEncodeError: 'charmap' codec can't encode character u'\u0308' in position 6: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)
如何将此数据导出到.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()
Run Code Online (Sandbox Code Playgroud)
这\u0308是一个结合的分离; 在解码为mac-roman之前,你需要规范化你的unicode字符串:
import unicodedata
unicodedata.normalize('NFC', projectDict['ProjectName'].decode('utf-8')).encode('mac-roman')
Run Code Online (Sandbox Code Playgroud)
演示,在归一化为组合字符后,将ä非规范化形式的字符(a加上组合分音符)编码为mac-roman:
>>> unicodedata.normalize('NFC', u'a\u0308').encode('mac-roman')
'\x8a'
Run Code Online (Sandbox Code Playgroud)
我过去曾使用这种技术为特定客户端生成CSV for Excel,他们的平台编码是预先知道的(Excel将使用当前的Windows编码解析文件,IIRC).在那种情况下,我编码为windows-1252.