Emacs 如何在区域输出上设置shell命令的编码?

Emacs 如何在区域输出上设置shell命令的编码?,emacs,unicode,utf-8,perl-tidy,Emacs,Unicode,Utf 8,Perl Tidy,我有一个小的elisp脚本,它在区域或整个文件上应用Perl::Tidy。以下是脚本(借用自EmacsWiki)供参考: 我正在使用当前的Emacs 23.1 for Windows(EmacsW32)。我遇到的问题是,如果我将该脚本应用于UTF-8编码文件(“状态栏中的U(Unix)”),则输出返回拉丁-1编码,即每个非ASCII源字符有两个或多个字符 我有什么办法可以解决这个问题吗 编辑:在myinit.el中使用(设置终端编码系统'utf-8-unix)似乎可以解决问题。如果任何人有其他的

我有一个小的elisp脚本,它在区域或整个文件上应用Perl::Tidy。以下是脚本(借用自EmacsWiki)供参考:

我正在使用当前的Emacs 23.1 for Windows(EmacsW32)。我遇到的问题是,如果我将该脚本应用于UTF-8编码文件(“状态栏中的U(Unix)”),则输出返回拉丁-1编码,即每个非ASCII源字符有两个或多个字符

我有什么办法可以解决这个问题吗


编辑:在my
init.el
中使用
(设置终端编码系统'utf-8-unix)
似乎可以解决问题。如果任何人有其他的解决方案,就写下来吧

引用区域上的
shell命令的文档(
C-h f shell命令区域RET
):

指定用于转换非ASCII字符的编码系统的步骤 在shell命令的输入和输出中,使用C-x RET C 在这个命令之前。默认情况下,输入(来自当前缓冲区) 在用于保存文件的同一编码系统中进行编码, `缓冲区文件编码系统'。如果输出将替换该区域, 然后从同一编码系统解码

非交互参数是START、END、COMMAND、, 输出缓冲区、替换、错误缓冲区和显示错误缓冲区。 非交互调用方可以通过绑定指定编码系统 `“读”和“写”的编码系统

换句话说,你会做一些类似的事情

(let ((coding-system-for-read 'utf-8-unix))
  (shell-command-on-region ...) )
这是未经测试的,不确定在您的情况下,读取的
编码系统(或者可能是
-write
)的值应该是多少。我想您也可以利用OUTPUT-BUFFER参数,将输出定向到一个缓冲区,该缓冲区的编码系统设置为您所需要的


另一种选择可能是在perltidy调用中晃动区域设置,但同样,没有关于您现在使用的内容的更多信息,也没有办法在类似于您的系统上进行实验,我只能提示。

下面是来自region
文档上的
shell命令

To specify a coding system for converting non-ASCII characters
in the input and output to the shell command, use C-x RET c
before this command.  By default, the input (from the current buffer)
is encoded using coding-system specified by `process-coding-system-alist',
falling back to `default-process-coding-system' if no match for COMMAND
is found in `process-coding-system-alist'.
在执行过程中,它首先从
过程编码系统列表
中查找编码系统,如果为零,则从
默认过程编码系统
中查找

如果要更改编码,可以将转换选项添加到
过程编码系统列表
,下面是它的内容

Value: (("\\.dz\\'" no-conversion . no-conversion)
 ...
("\\.elc\\'" . utf-8-emacs)
("\\.utf\\(-8\\)?\\'" . utf-8)
("\\.xml\\'" . xml-find-file-coding-system)
 ...
("" undecided))
或者,如果您没有设置
过程编码系统列表
,它是零,您可以将编码选项指定给
默认过程编码系统

例如:

(setq default-process-coding-system '(utf-8 . utf-8))
(如果输入编码为
utf-8
,则输出编码为
utf-8

如果你想了解详细情况,我也写了一篇关于这个的文章

(setq default-process-coding-system '(utf-8 . utf-8))
(setq default-process-coding-system '(undecided-unix . iso-latin-1-unix))