当我这样做时
u','.join([u'\u4e8c\u6797', unicode(10)])
它以UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
失败。列表中的所有三个项都是unicode类型。
为什么要尝试在ascii中编码?我不希望它转换为ascii字符串。我该如何避免呢?
答案 0 :(得分:0)
信息不够,因为它显示的效果很好:
>>> u','.join([u'\u4e8c\u6797', unicode(10)])
u'\u4e8c\u6797,10'
但是我的水晶球说你试图以某种方式打印它:
>>> print u','.join([u'\u4e8c\u6797', unicode(10)])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\dev\Python27\lib\encodings\cp437.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode characters in position 0-1: character maps to <undefined>
原因是,至少在我的系统上,终端使用cp437
编码,并且无法对该编码中的Unicode字符进行编码。
或者更有可能写入文件或管道:
>>> with open('out.txt','w') as f:
... f.write(u','.join([u'\u4e8c\u6797', unicode(10)]))
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
文件必须告知编码,例如UTF-8,或者默认为ASCII:
>>> import codecs
>>> with open('out.txt','w') as f:
... f.write(u','.join([u'\u4e8c\u6797', unicode(10)]).encode('utf8'))
...
>>> # SUCCESS!