输入中文字符在ESS中未正确回显

时间:2013-04-26 04:24:00

标签: r emacs ess chinese-locale

我的Emacs和R环境有这个奇怪的编码问题。除了输入的回声之外,我的.Rprofile设置Sys.setlocale("LC_ALL","zh_CN.utf-8");显示中文字符都很好。

    > linkTexts[5]
          font 
    "使用帮助" 
    > functionNotExist()
    错误: 没有"functionNotExist"这个函数
    > fire <- "你好"
    > fire
    [1] "  "

正如我们所看到的,向量linkTexts中包含的中文字符,中文错误消息和输入中文字符都可以完美显示,但输入字符的回显仅显示为空白占位符。

sessionInfo()就在这里,这符合Sys.setlocale("LC_ALL","zh_CN.utf-8");设置的预期:

    > sessionInfo()
    R version 2.15.2 (2012-10-26)
    Platform: i386-apple-darwin9.8.0/i386 (32-bit)

    locale:
    [1] zh_CN.utf-8/zh_CN.utf-8/zh_CN.utf-8/C/zh_CN.utf-8/C

    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     

    other attached packages:
    [1] XML_3.96-1.1

    loaded via a namespace (and not attached):
    [1] compiler_2.15.2 tools_2.15.2   

我在.Emacs文件中没有区域设置。

对我来说,这似乎是一个Emacs编码问题,但我只是不知道如何纠正它。有什么想法或建议吗?感谢。

2 个答案:

答案 0 :(得分:1)

您的示例开箱即用。您可以使用 M-x set-buffer-process-coding-system设置emacs进程解码/编码。一旦你弄清楚什么编码有效(如果有的话),你可以使用以下方法永久改变:

(add-hook 'ess-R-post-run-hook
          (lambda () (set-buffer-process-coding-system
                      'utf-8-unix 'utf-8-unix)))

utf-8-unix替换为您选择的编码。

我不太相信上述内容会有所帮助。您的示例中的LinkText显示效果很好,但是火不显示,看起来不像emacs / ESS问题。

答案 1 :(得分:1)

VitoshKa提出了完全正确的建议。我只想在这里添加更多自己的发现,因为人们可能遇到不同但相似的特殊性格问题。然而,它们可以用同样的方式解决。

根本原因是当前缓冲区进程的输入编码设置。如M-x describe-current-coding-system命令所示,默认缓冲区进程编码设置适用于输出(utf-8-unix)但输入恶化:

    Coding systems for process I/O:
      encoding input to the process: 1 -- iso-latin-1-unix (alias: iso-8859-1-unix latin-1-unix)

      decoding output from the process: U -- utf-8-unix (alias: mule-utf-8-unix)

将输入的编码系统更改为utf-8-unix,或者通过'Mx set-buffer-process-coding-system'或将ess-post-run-hook添加到.emacs,如同VitoshKa建议的那样,足以解决汉字显示问题。

由于此设置,人们可能遇到的另一个问题是ESS中的特殊字符。尝试输入特殊字符时,您可能会收到英文错误消息错误: 句法分析器%d行里不能有多字节字符 invalid multibyte character in parser at line %d

    > x <- data.frame(part = c("målløs", "ny"))
    错误: 句法分析器1行里不能有多字节字符

对于缓冲进程的输入编码系统的正确utf-8-unix设置,特殊字符的上述错误消失。