Emacs 程序 process 进程 不能显示中文

Emacs 中文输入没有问题, 但是程序中 print 命令不能打印中文。例如 python, 大家碰到过类似问题吗? 结果如下图片

在 R中

在 Python 中

是否是类似的问题,或许你的描述可以更加详尽 :slight_smile:

@Samray 恩,谢谢,是一样的问题,不知如何解决。不光python,在R (ess 包) 里面也一样。输入 a = ‘中文’, 不能正常显示 a的打印结果。

要不你提供一下简单的示例代码以及你的操作流程以重现问题,Emacs 在Windows 上面会有各种各样玄学的问题.

@Samray 好的,如果是 R process, 只需要输入

a = '中文’

a

则会打印

[1] "\344\270\255\346\226\207"

如果是 python process, 输入

a = '中文’

则会报错,并显示

UnicodeEncodeError: ‘utf-8’ codec can’t encode characters in position 14-19: surrogates not allowed

但是这些在 terminal 里面都没有问题,感觉像是 emacs 的process 字符交换编码解码除了问题。但不知如何设置。 因此,我猜测Emacs在其他的编程语言中打印中文可能也会出现问题。

系统为 MacOS。

是的 所以windows上我对进程编码放弃中文显示,要用就用纯英文

不明白怎么重现?

~ $ emacs --version | head -1
GNU Emacs 25.3.1
~ $ python --version
Python 3.6.5
~ $ emacs -Q -nw -f run-python

要不试试这个:

;;;; 设置编辑环境
;; 设置为中文简体语言环境
(set-language-environment 'Chinese-GB)

chinese 如果还不行,可以试试这个:

;; 终端中文乱码
(set-terminal-coding-system 'utf-8)
(modify-coding-system-alist 'process "*" 'utf-8)
(setq default-process-coding-system '(utf-8 . utf-8))

这样可以重现,但i没有太值得意外的地方,Python 默认用 UTF-8,如果把下面的代码用 GBK 保存

a = '中文'
print(a)

Python 会报类似的错

~ $ cat foo.py | iconv --from-code gbk --to-code utf-8
a = '中文'
print(a)
~ $ python -c 'import sys; print(sys.getdefaultencoding())'
utf-8
~ $ python foo.py
  File "foo.py", line 1
SyntaxError: Non-UTF-8 code starting with '\xd6' in file foo.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
~ $

所以你试试把 M-x run-python 的 Process 的 IO 编码改成 UTF-8 的,一个办法是用 C-x RET p (set-buffer-process-coding-system)

1 个赞

python 2跟3最重要的区别之一就是是否支持utf8

@LuhengStat 所以你是python2 还是python3? 需要注意的是,python3 保存中文的时候,不是直接显示中文,而是存在一类中间码里面,看起来就像0x\043 等等。

python 3,但是在终端里面可以,很奇怪

就是这么设置的,在终端里面可以显示,但是emacs里不行。set-buffer-process-coding-system 换了好几个也不可以。

要不截个图或者做个gif 来重现问题,现在似乎其他人都无法复现这个问题.

系統语言是简体中文嗎?

用 M-x revert-buffer-with-coding-system 转换一下试试看是那种编码.

对于R,可以看describe-coding-system出来的 Coding system for keyboard input: c – chinese-gbk-unix (alias: gbk-unix cp936-unix windows-936-unix)

(set-process-coding-system (get-buffer-process “R”) 'chinese-gb18030-dos 'chinese-gb18030-dos)

但是会有别的问题

不是,用的英文版。跟这个有关?

关系还挺大的,建议你换成中文重启一下试试。

实际上不一定要换系统语言,只要 locale 设置对了应该就没问题,不过设置 locale 最容易的办法还是改系统语言。

好的,我马上试试。谢谢