HTMLの文書を電子書籍化してタブレット(Kindle)で読みたいと思いKindle Previewerで変換したところ日本語が文字化けしてしまった。ファイルはもちろんUTF–8でmetaタグも適切に書いたはずなのに化けてしまう。日本語と英語が混在しているせいなのかも知れないが、ともかく日本語をUTF–8の文字コードにしてしまえば良いようです。

こういうのはエディターだけあってEmacsが強いところ。

(defun my-multibyte-p (c)
  (> c 255))

(defun replace-char-by-codepoint ()
  (interactive)
  (let* ((char (char-after))
         (enc (when (my-multibyte-p char)
                (format "&#%d;" char))))
    (if (null enc)
        (forward-char 1)
      (delete-char 1)
      (insert enc))))

(defun replace-char-by-codepoint-on-region (beg end)
  (interactive "r")
  (let ((count (- end beg)))
    (goto-char beg)
    (dotimes (_ count)
      (replace-char-by-codepoint))))

これらを*scratch*バッファで評価する(C-j)。

変換したい文字の上でM-x replace-char-by-codepointとすれば置換される。あるいはリージョンを選択してM-x replace-char-by-codepoint-on-regionとすればリージョンが置換される。

M-xで呼ぶのが面倒なら一時的にキーを設定してもいいでしょう。例えばあまり使われていないと思われるC-tなどに割り当ててしまう。*scratch*バッファで

(global-set-key (kbd "C-t") 'replace-char-by-codepoint)

と書いてC-jで評価すれば良い。

スクリプト言語でやってもいいですが作業中に一部分だけちょっと変換したいとか、結果を目視で確認できるというのがElispの良いところで、ミスしたらundoすれば良いというのも安心感があります。