我刚刚运行了一个正在运行的应用程序的一些unicode错误,它不时地处理非常奇怪的字符串,最近,
Pınar Karsıyaka
在我的开发环境中(Aptana w.PyDev on Mavericks Mac上有一个最新的自制软件安装),处理这个字符串不会产生错误,并作为
打印到控制台P\u0131nar Kars\u0131yaka v Torku Selcuk
但在生产环境中,标准的Ubuntu和Python安装在Amazon EC2小盒子上,打印方式如
P\xc4\xb1nar Kars\xc4\xb1yaka v Torku Selcuk
并给出了一个可怕的Python错误,
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0131' in position 50: ordinal not in range(128)
我想知道如何(如果可能的话)使prod环境能够处理这些字符,比如我的开发环境可以,但也希望能够改变我的开发环境来破坏像prod一,所以我可以处理在代码中发生这种情况的事件。
感谢您提供任何帮助。
Mac Python - Python 2.7.5(默认,2013年11月1日,18:38:34) [达尔文的GCC 4.2.1兼容的Apple LLVM 5.0(clang-500.2.79)]
Ubuntu Python - Python 2.7.3(默认,2013年4月10日,06:20:15) linux2上的[GCC 4.6.3]
答案 0 :(得分:3)
如果你在python源码的2.7分支中稍微潜水,你会发现default encoding of unicode strings首先是set to some forced value(现在,它是“ascii”,尽管它已经是“utf” -8“之前),但在解释器的每个实例化期间都是overridden by the site module。
要检查每个平台上的行为,请运行:
$ python -c 'import sys; print(sys.getdefaultencoding())'
现在,如果你想让它们均匀,那就不是很简单,因为这个功能 'setdefaultencoding'是deleted in the site module,所以你必须这样做 重新加载sys模块以获取它:
$ python -c 'import sys; reload(sys); sys.setdefaultencoding("utf-8"); print(sys.getdefaultencoding())'
这样,无论语言环境如何,您都可以在每个平台上使用相同的编码在解释器中 从os到python构建的多个级别定义的编码。
答案 1 :(得分:1)
图书馆版
请确认所有库版本都相同,我怀疑API更改会从某些外部数据源返回unicode
vs str
。升级SQLObject
和Cherrypy
之前,我已经看到过这些问题。此外,数据源设置也很重要,例如,如果您使用mysql
服务器,则需要注意default_encoding
。
您的问题没有指明数据来源,很难猜测。
至少,请在两个环节中进行pip freeze
并比较版本号。
默认编码
检查其中一个环境中是否有sitecustomize.py
- 这是设置任何不稳定事物的官方方式(无论如何你不应该这样做,但那是另一个故事)。
它可能与@ chocko01建议完全相同 - 设置了deafault编码。通过在两种环境中记录sys.getdefaultencoding()
来检查它。
在Python中设置默认编码使转换unicode<->str
(Python2)和str<->bytes
(Python3)透明,但从长远来看,这是一个坏主意。请记住explicit is better than implicit
。
跟踪您的数据
它很难解决,但除非你能在可重复的测试中捕捉到这个特殊的问题,否则第二好的就是倾倒大量的原木,然后向后工作,看看你的时髦之处输入来自。
然后向下追踪它以确定本地和生产环境之间的差异。
出现错误时,它在您的本地环境中unicode
和生成环境中的UTF-8
编码,又名str
。您有两个环境样本的事实表明您能够重现该问题。也许你应该写一个自动化测试。