怎么设置特定类型文件的编码?

现在不得不在Win下用Emacs,但是遇到一些.log文件是乱码。如

CPU时间 1.17秒

显示为:

CPU \312\261\274\344 1.17 \303\353

直接复制到Emacs(utf-8)是这样的:

CPU ʱ¼ä 1.17 Ãë

这些.log是配置好的环境运算过程产生的,我最多只能调用Emacs执行,但不能修改已有配置。

请问,在Emacs里,不改动其他编码(utf-8)的情况下,如何找到这些 .log文件的正确编码,并设置打开这些文件就自动切换。

谢谢!

当前describe-coding-system是这样的:

Particular coding systems specified for certain file names:

  OPERATION	TARGET PATTERN		CODING SYSTEM(s)
  ---------	--------------		----------------
  File I/O      "\\.tzst\\'"            (no-conversion . no-conversion)
                "\\.zst\\'"             (no-conversion . no-conversion)
                "\\.dz\\'"              (no-conversion . no-conversion)
                "\\.txz\\'"             (no-conversion . no-conversion)
                "\\.xz\\'"              (no-conversion . no-conversion)
                "\\.lzma\\'"            (no-conversion . no-conversion)
                "\\.lz\\'"              (no-conversion . no-conversion)
                "\\.g?z\\'"             (no-conversion . no-conversion)
                "\\.\\(?:tgz\\|svgz\\|sifz\\)\\'"
                                        (no-conversion . no-conversion)
                "\\.tbz2?\\'"           (no-conversion . no-conversion)
                "\\.bz2\\'"             (no-conversion . no-conversion)
                "\\.Z\\'"               (no-conversion . no-conversion)
                "\\.elc\\'"             utf-8-emacs
                "\\.el\\'"              prefer-utf-8
                "\\.utf\\(-8\\)?\\'"    utf-8
                "\\.xml\\'"             xml-find-file-coding-system
                "\\(\\`\\|/\\)loaddefs.el\\'"
                                        (raw-text . raw-text-unix)
                "\\.tar\\'"             (no-conversion . no-conversion)
                "\\.po[tx]?\\'\\|\\.po\\."
                                        po-find-file-coding-system
                "\\.\\(tex\\|ltx\\|dtx\\|drv\\)\\'"
                                        latexenc-find-file-coding-system
                ""                      (undecided)
  Process I/O   "[pP][lL][iI][nN][kK]"  (undecided-dos . undecided-dos)
                "[cC][mM][dD][pP][rR][oO][xX][yY]"
                                        (undecided-dos . undecided-dos)
  Network I/O	nothing specified

打开下面这个勾选项,就可以支持UTF-8 显示中文了

这个需要管理员权限,而我只能以普通用户运行 :joy:

要不你就在Emacs 设置一下别用UTF-8 显示,估计就可以解决了。在Windows 上的编码问题是挺折腾的。

我字体和编码的设置就这几句,现在windows的情况是gbk文件里面有中文时emacs打开会识别成gbk(即使文件很大10m),如果gbk文件里面没有任何中文,emacs打开会自动显示成utf-8

(prefer-coding-system 'utf-8);这样设置文件编码正常了但shell-mode里执行不了中文命令参数
(dolist (charset '(kana han symbol cjk-misc bopomofo))
(set-fontset-font (frame-parameter nil 'font) 
                  charset
                  (font-spec :family "courier new" :height 110 )))

除了(prefer-coding-system 'utf-8),我还设置了(set-default-coding-systems 'utf-8)

字体部分:

(progn
    (set-face-attribute
     'default nil
     :font (font-spec :name "SF Mono"
                      :weight 'normal
                      :slant 'normal
                      :size 11.5))
    (dolist (charset '(han kana symbol cjk-misc bopomofo))
      (set-fontset-font
       (frame-parameter nil 'font)
       charset
       (font-spec :name "Microsoft Yahei UI"
                  :weight 'normal
                  :slant 'normal)))
    (setq face-font-rescale-alist '(("Microsoft Yahei UI" . 1.2)
                                    ("Noto Sans CJK SC" . 1.2)
                                    ("微软雅黑" . 1.2)
                                    ("Microsoft Yahei" . 1.2)
                                    ("WenQuanYi Zen Hei" . 1.2))))

看起来没什么问题,关键我自己的Windows机上是没问题的,也不知道这边管理员装机的时候怎么设置的 :frowning_face:


@aqua0210 说的我也试了,不生效…… 我看看是不是还有哪里的Emacs设置有问题 :sleepy:

;; set coding config, last is highest priority.
;; https://www.gnu.org/software/emacs/manual/html_node/emacs/Recognize-Coding.html#Recognize-Coding
(prefer-coding-system 'cp950)
(prefer-coding-system 'gb2312)
(prefer-coding-system 'cp936)
(prefer-coding-system 'gb18030)
(prefer-coding-system 'utf-16)
(prefer-coding-system 'utf-8-dos)
;; (prefer-coding-system 'utf-8-unix)
(prefer-coding-system 'utf-8)
1 个赞

首先确定log文件编码,使用正则过滤编码比较稳定,在windows下体验

;; 打开/写入logs/目录下的*.log文件使用utf-8编码

(modify-coding-system-alist ‘file "logs\/.*\.log\’" 'utf-8)

针对楼主的问题,编码应该设为 'gb2312

感谢大家的回复,我在 @dingyi342 的链接中找到了 @emacle 说的方法,得以解决:

(modify-coding-system-alist 'file "\\.log\\'" 'chinese-iso-8bit)

现在新的问题是,还有另外一种扩展名的纯文本文件,却跟log不是同样的编码,比着上边的代码解决不了。很奇怪,正在测试。

多半还是编码没选对,可以先测乱码文本,例如:

(decode-coding-string "CPU \312\261\274\344 1.17 \303\353" 'gb2312)
;; => #("CPU 时间 1.17 秒" 4 13 (charset chinese-gb2312))

确定编码之后再配置。

刚刚解决。 编码没问题,设置为chinese-iso-8bit就行了。后来发现是输入数据的问题,用了不同的编码方式,不全是log的锅 :sweat_smile:


chinese-iso-8bit (alias: cn-gb-2312 euc-china euc-cn cn-gb gb2312)

我没说 'chinese-iso-8bit 不对,而是说你另外一种文件可能设置了不同的编码。

确实是另一个文件的问题,只不过这俩都是结果的一部分,最终的原因在输入的数据文件上。全程保持一致就行了,目前还没发现其他问题。