0

当我做

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 字符串。我该如何避免呢?

4

1 回答 1

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!
于 2013-06-28T06:56:36.307 回答