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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM