我在生产系统中遇到错误,我无法在开发环境中重现:
with io.open(file_name, 'wt') as fd: fd.write(data)
例外:
File "/home/.../foo.py", line 18, in foo fd.write(data) UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 6400: ordinal not in range(128)
我已经尝试过将很多奇怪的字符放入变量中data
.
但到目前为止,我无法重现UnicodeEncodeError
.
有什么需要在data
得到一个UnicodeEncodeError
?
python -c 'import locale; print locale.getpreferredencoding()' UTF-8UPDATE2
如果我locale.getpreferredencoding()
通过shell和Web请求调用,则编码为"UTF-8".
我在我的代码中更新了我的异常处理并记录了getpreferredencoding()
几天.现在它再次发生(到目前为止我无法强制或重现),编码为"ANSI_X3.4-1968"!
我不知道这个编码设置的位置....
这使我的问题朝着不同的方向发展.留下这个问题毫无用处.我现在的问题是:首选编码在哪里被改变?但这不是这个问题的一部分.
非常感谢所有人
您依赖于平台的默认编码; 如果默认编码不支持您写入文件的Unicode字符,则会出现编码异常.
从io.open()
文档:
encoding是用于解码或编码文件的编码的名称.这应该只在文本模式下使用.默认编码是平台相关的(无论
locale.getpreferredencoding()
返回什么),但可以使用Python支持的任何编码.
对于您的特定情况,返回的默认locale.getpreferredencoding()
值为ASCII,因此ASCII范围之外的任何Unicode字符都会导致此问题,U-0080及以上.
请注意,区域设置取自您的环境; 如果是ASCII,则通常意味着将语言环境设置为POSIX默认语言环境C
.
明确指定编码:
with io.open(file_name, 'wt', encoding='utf8') as fd: fd.write(data)
我用UTF-8作为例子; 你选择的内容完全取决于你的用例和你想要写出的数据.