Windows平台下在Emacs中使用plantuml中文乱码问题(已解决)
当我们在Emacs中使用plantuml时,如果使用了中文,则可能会遇到中文乱码问题。
plantuml的配置和教程参见另一篇文章:
http://www.cnblogs.com/yangwen0228/p/6825560.html
假设,我们做一个下面的例子:
#+BEGIN_SRC plantuml :file "http://images2015.cnblogs.com/blog/717724/201705/717724-20170508161213488-1137189911.jpg" title 时序图 == 鉴权阶段 == Alice -> Bob: 请求 Bob -> Alice: 应答 == 数据上传 == Alice -> Bob: 上传数据 note left: 这是显示在左边的备注 Bob --> Canny: 转交数据 ... 不超过 5 秒钟 ... Canny --> Bob: 状态返回 note right: 这是显示在右边的备注 Bob -> Alice: 状态返回 == 状态显示 == Alice -> Alice: 给自己发消息 #+END_SRC
我们可以看到,结果是乱码:
那么,是什么原因导致了乱码呢?
首先,我们的文件编码是utf-8,而plantuml默认使用系统编码,那么应该gb2312编码。所以,会出现乱码。解决方法是,在code block的option中添加 ~:cmdline -charset utf-8~。
这个是导出plantuml的源码:
(defun org-babel-execute:plantuml (body params) "Execute a block of plantuml code with org-babel. This function is called by `org-babel-execute-src-block'." (let* ((result-params (split-string (or (cdr (assoc :results params)) ""))) (out-file (or (cdr (assoc :file params)) (error "PlantUML requires a ":file" header argument"))) (cmdline (cdr (assoc :cmdline params))) (in-file (org-babel-temp-file "plantuml-")) (java (or (cdr (assoc :java params)) "")) (cmd (if (string= "" org-plantuml-jar-path) (error "`org-plantuml-jar-path' is not set") (concat "java " java " -jar " (shell-quote-argument (expand-file-name org-plantuml-jar-path)) (if (string= (file-name-extension out-file) "svg") " -tsvg" "") (if (string= (file-name-extension out-file) "eps") " -teps" "") " -p " cmdline " < " (org-babel-process-file-name in-file) " > " (org-babel-process-file-name out-file))))) (unless (file-exists-p org-plantuml-jar-path) (error "Could not find plantuml.jar at %s" org-plantuml-jar-path)) (with-temp-file in-file (insert (concat "@startuml " body " @enduml"))) (message "%s" cmd) (org-babel-eval cmd "") nil))
添加 :cmdline -charset utf-8
:
#+BEGIN_SRC plantuml :file "http://images2015.cnblogs.com/blog/717724/201705/717724-20170508161216691-1631285625.jpg" :cmdline -charset utf-8 title 时序图 == 鉴权阶段 == Alice -> Bob: 请求 Bob -> Alice: 应答 == 数据上传 == Alice -> Bob: 上传数据 note left: 这是显示在左边的备注 Bob --> Canny: 转交数据 ... 不超过 5 秒钟 ... Canny --> Bob: 状态返回 note right: 这是显示在右边的备注 Bob -> Alice: 状态返回 == 状态显示 == Alice -> Alice: 给自己发消息 #+END_SRC
正确的中文编码结果: