[求助] Windows Emacs 加密 Org headline 后乱码 ^M 导致无法解密

如问题所描述,只能加密,加密后乱码由于 ^M 导致无法解密,其它系统正常,Windows 系统怎么解决这个问题???

这个^M指的是win的换行符(\r\n),按理说不应该导致无法解密啊,,试下M-x set-buffer-file-coding-system设置成utf-8-unix试试,可以在文件第一行写入# -*- coding: utf-8-unix -*-,强制emacs使用这个coding。

都无效,我现在是把 ^M 去掉再解密的

(defun freedom/org-decrypt-entry ()
  "Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
  (goto-char (point-min))
    (while (search-forward "\r" nil t) (replace-match ""))
  (org-decrypt-entry))

建议检查下新建org文件是什么编码,打开utf8-unix的org文件后是什么编码,什么时候出现的^M。

(setq default-buffer-file-coding-system 'utf-8)
(prefer-coding-system 'utf-8)
添加了这两个配置, 新建 org 文件保存后变为 CRLF UTF-8 编码,什么编码才能去掉 ^M

用 utf-8-unix

(set-language-environment 'Chinese-GB) ;; 设置为中文简体语言环境
(set-keyboard-coding-system 'utf-8)    ;; 设置键盘输入时的字符编码

;; 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)
;; 文件默认保存为 utf-8
(set-buffer-file-coding-system 'utf-8-unix)
(set-default buffer-file-coding-system 'utf-8-unix)
(set-default-coding-systems 'utf-8-unix)
;; 解决文件目录的中文名乱码
(setq-default pathname-coding-system 'utf-8)
(set-file-name-coding-system 'utf-8)

啊,这种事啊,两个万能的键:

  • C-x RET r 选择特定的编码重新打开文件
  • C-x RET f 把当前 buffer 转成特定的编码

解决不了,设置为 utf-8-unix 新建org文件也是一样,解决不了

我把你的这个设置进去也是没法解决, 同样的问题,新建org文件保存也是有 ^M

应该是换行符的问题,不是编码的问题
我使用 记事本 软件打开没有 ^M , 而且编码已经是 unix(LF) UTF-8

有没有用emacs -q试过?

刚测试过,同样的问题

你用的什么版本,我也是windows,org文件没出现过这个问题

GNU Emacs 27.2

这个似乎是Windows版GnuPG的问题,目前这个问题的唯一解决方案是在msys2环境中安装gnupg和emacs,让emacs使用msys2中的gnupg加密。

噢, 没想到这个帖子还有人回复, 都怪我忘记了说解决方法了… 抱歉
原因:
是因为换行符的问题, 比如如果Windows使用的是 utf-8 保存文件, 默认使用的是 utf-8-doc 编码, 然后加密就会出现这问题
解决方法: 在未加密前将文件编码换成 utf-8-unix 就不会有这问题了

如果你已经加密了, 并且由于 ^M 出现无法解密, 将 ^M 删除就可以了, 可以使用下面的函数将当前buffer中的所有 ^M 删除:

 (defun freedom-delete-crlf ()
    "移除行尾 ^M(CRLF) Replace DOS eolns CR LF with Unix eolns CR"
    (interactive)
    (while (search-forward "\r" nil t) (replace-match "")))