[Emacs][PukiWiki] pukiwiki-mode.el で日本語ページを編集する

私は備忘録のために,いろいろな知識を Pukiwiki に書きためている.はてなに似た(はてなPukiwiki に似てる?)簡単な記法で構造的な文書を書くことができ,誰でも編集することができるので知識の集約などによく使われている.Web から編集するのが市場のオーソドックスな編集方法であるが,いささか使いにくいため私は Emacspukiwiki-mode.el を用いて編集をしている.

pukiwiki-mode.el

やはり文章を編集する際には Emacs を使いたいものです.pukiwiki-mode.el を使えば Emacs から Pukiwiki を編集することができます.Web からの編集とは段違いの速度で編集できます.動作に必要な環境は,

  1. http.el
  2. diff (ページの衝突の際に使っている)

です.導入や使い方はリンクの方に乗っているからいいのですが,pukiwiki-mode を使う上で1つ大問題がありました.それは,日本語を含むページの編集ができないことです.日本語のページを編集しようとするとページ名が文字化けしてしまい,そのページにたどり着くことができません.これではなかなか使いづらいので解決法を探ってみました.

http-url-unhexify-string を修正する

ここのコメントでも言及されていたのですが,日本語が文字化けしている原因は http-url-unhexify-string(pukiwiki-mode.el 3180行目あたり)がうまくマルチバイト文字の処理が出来ていないことのようです.実を言うと Emacs での文字処理やエンコードのことはあまり調べてないので,詳細にはここの処理が分かっているわけではないですが,エンコードの際にマルチバイト文字を一文字ずつ format で文字にしているので,マルチバイトとしてデコードすることができなくなり文字化けしているように見えました.

http-url-unhexify-string は関数の最後で,decode-coding-string でデコードされ日本語ページのページ名が返ってくる設計になっているようですので,この decode-coding-string になんとかデコードできる形の引数を渡してやればいいことになります.で,数時間かけて自分の手でなんやかやいじくりまわしていたのですが,まったく思い通りに処理することができず困っていたところ,そんな事せずともすでにそういう事をしてくれる関数を実装しているものがありました.url-util.el(標準で入ってます) に url-unhex-string という関数があり,これがまさにやりたいことをしてくれる関数でした.結局それを使って1行追加するだけで終わってしまいました.

(defun http-url-unhexify-string (str coding)
  "Unescape characters in a string."
  (save-match-data
    (let ((result (string-as-unibyte str)) (pos -1))
      (while (setq pos (string-match "+" result (1+ pos)))
        (setq result (replace-match " " nil nil result)))
      (setq pos -1)
      (while (setq pos
                   (string-match
                    "%\\([0-9a-fA-F][0-9a-fA-F]\\)" result (1+ pos)))
        (setq result
              (replace-match
               (format "%c"
                       (eval (read (concat "?\\x"
                                           (match-string 1 result)))))
               t t result)))
      (setq result (url-unhex-string str)) ; この行を追加する
      (decode-coding-string result coding))))

これだけで,無事 pukiwiki-mode で日本語ページを編集できるようになりました.これでますます充実した Pukiwiki 生活が送れそうです.