如问题所描述,只能加密,加密后乱码由于 ^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 "")))