当前位置:  开发笔记 > 编程语言 > 正文

如何重现UnicodeEncodeError?

如何解决《如何重现UnicodeEncodeError?》经验,为你挑选了1个好方法。

我在生产系统中遇到错误,我无法在开发环境中重现:

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-8
UPDATE2

如果我locale.getpreferredencoding()通过shell和Web请求调用,则编码为"UTF-8".

我在我的代码中更新了我的异常处理并记录了getpreferredencoding()几天.现在它再次发生(到目前为止我无法强制或重现),编码为"ANSI_X3.4-1968"!

我不知道这个编码设置的位置....

这使我的问题朝着不同的方向发展.留下这个问题毫无用处.我现在的问题是:首选编码在哪里被改变?但这不是这个问题的一部分.

非常感谢所有人



1> Martijn Piet..:

您依赖于平台的默认编码; 如果默认编码不支持您写入文件的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作为例子; 你选择的内容完全取决于你的用例和你想要写出的数据.

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有