在BBEdit中运行Python时的编码错误

2 投票
2 回答
808 浏览
提问于 2025-04-16 17:31

这是一个让我困惑很久的问题。我用bbedit来编辑Python代码。我理解的是,从编辑器里运行代码时,它会启动一个自己的Python进程,执行代码,然后把输出写到一个日志文件里。所以bbedit并不知道环境变量之类的东西。如果我在终端的命令行里这样做:

>>> s = 'háček'
>>> print s
háček

结果很好。但是如果我在bbedit里有以下这个文件:

#!/opt/local/bin/python
# -*- coding: utf-8 -*- # 

s = u'háček'
print s

然后尝试从编辑器里运行它,我就会得到:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)

所以我不得不这样做:

print s.encode('utf-8')

有没有人能告诉我bbedit发生了什么?有没有办法让编辑器在遇到unicode字符时知道该怎么处理?

谢谢,

Jon

2 个回答

2

如果BBEdit依赖外部文件或者重定向来完成这个操作,那么就没办法修复了。要修复这个问题,需要对一些内部的Python结构进行调整,以便告诉它在输出时使用UTF-8编码。

1

如果其他人也遇到过这个问题,这里有个我之前不知道的python小知识:

BBedit的工作人员帮我澄清了这个问题。

具体的问题似乎是bbedit在运行时出现的一个情况,他们还没有找到原因,但有一个解决办法:

Python有一个特别的脚本,叫做"sitecustomize.py"

如果你把以下内容放入sitecustomize.py中:

import sys
sys.setdefaultencoding('utf-8')

然后把这个文件移动到

/Path/To/Python/Installation/site-packages/

这样,当bbedit启动一个python进程时,python的'site'模块会自动调用sys.setdefaultencoding(),然后在为这个会话设置好默认编码后(这部分有点奇怪),会把setdefaultencoding从sys命名空间中移除。具体可以查看:

http://docs.python.org/library/sys.html#sys.setdefaultencoding

撰写回答