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\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
正確的中文編碼結果: