让Emacs在Python交互模式下使用UTF-8

7
当我从Mac OS的Terminal.app启动Python时,Python将编码识别为UTF-8:
$ python3.0
Python 3.0.1 (r301:69556, May 18 2009, 16:44:01) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'UTF-8'

这同样适用于Python2.5。

但在Emacs中,编码是US-ASCII。

Python 3.0.1 (r301:69556, May 18 2009, 16:44:01) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'US-ASCII'

如何让Emacs与Python通信,使得sys.stdout知道使用UTF-8?
编辑:由于我没有修改已接受答案的权限,在这里准确地描述了在Aquaemacs 1.6,Mac OS 10.5.6上为我工作的内容。
在python-mode-hook中,我添加了以下行:
(setenv "LANG" "en_GB.UTF-8")

显然,Mac OS需要使用“UTF-8”,而dfa表示Ubuntu需要使用“UTF8”。

此外,我不得不通过执行C-x RET p,然后输入两次“utf-8”来设置输入/输出编码。我应该找到如何永久设置它的方法。

感谢dfa和Jouni共同帮助我找到答案。

以下是我的最终python-mode-hook:

(add-hook 'python-mode-hook
  (lambda ()
        (set (make-variable-buffer-local 'beginning-of-defun-function)
             'py-beginning-of-def-or-class)
        (define-key py-mode-map "\C-c\C-z" 'py-shell)
        (setq outline-regexp "def\\|class ")
        (setenv "LANG" "en_GB.UTF-8"))) ; <-- *this* line is new

注意:在Ubuntu上,必须将LANG设置为en_GB.UTF8,否则会出现问题。 - dfa
谢谢,我更正了我的总结。 - Nathan Shively-Sanders
在Ubuntu上去掉破折号? 我总是使用UTF-8格式,它很有效。 - u0b34a0f6ae
1个回答

7
检查您的环境变量:
$ LANG="en_US.UTF8" python -c "import sys; print sys.stdout.encoding"
UTF-8
$ LANG="en_US" python -c "import sys; print sys.stdout.encoding"  
ANSI_X3.4-1968

在您的 Python 钩子中,请尝试:

(setenv "LANG" "en_US.UTF8")

这是python-mode-hook,对吧?设置LANG没有改变任何东西。虽然我的环境变量没有被(Aqua)emacs捕获。 - Nathan Shively-Sanders
我认为在OS X上应该是"en_US.UTF-8" - 注意连字符。为了让Emacs获取您的环境变量,您可以使用属性列表编辑器全局设置它们在~/.MacOSX/environment.plist中。 - Jouni K. Seppänen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接