Windows平台下在Emacs中使用plantuml中文乱码问题(已解决)

Windows平台下在Emacs中使用plantuml中文乱码问题(已解决)

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

我们可以看到,结果是乱码:

http://images2015.cnblogs.com/blog/717724/201705/717724-20170508161215691-1089193198.jpg

那么,是什么原因导致了乱码呢?
首先,我们的文件编码是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\n" body "\n@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

正确的中文编码结果:

http://images2015.cnblogs.com/blog/717724/201705/717724-20170508161218035-803738026.jpg

Date: 2017-05-08 15:58

Created: 2017-05-08 周一 16:12

Emacs 26.0.50 (Org mode 8.2.10)

Validate

posted @ 2017-05-08 16:10  yangwen0228  阅读(3002)  评论(0编辑  收藏  举报