Common Lispで動くcurses (cl-charms)で日本語を出力する

cl-charmsのAPIをそのまま使うと日本語の文字列は文字化けして出力されます。 対処の方法を調べるのに時間がかかったのでここにメモ。

手元で試した限りだと、cl-charmsの処理に入る前に(cl-setlocale:set-all-to-native)を実行しておけば大丈夫そうでした。 localeを設定すれば大丈夫というのは検索すれば出てくるのですが、Common Lispからどうやればいいのかは分からず、結局lemのコードを読んでいて見つけました。(ありがとうございます!)

以下、サンプルコードです。 charms-ja.lispという名前で保存し、ros -s cl-charms -s cl-setlocale -l charms-ja.lisp -e '(charms-ja:main)' -q と打てば実行できると思います。

(defpackage :charms-ja
  (:use :cl)
  (:export :main))
(in-package :charms-ja)

(defun main ()
  (cl-setlocale:set-all-to-native)
  (charms:with-curses ()
    (charms:disable-echoing)
    (charms:enable-raw-input :interpret-control-characters t)
    (charms:enable-non-blocking-mode charms:*standard-window*)
    (loop for c = (charms:get-char charms:*standard-window*
                                   :ignore-error t)
          do (progn
               (charms:clear-window charms:*standard-window*)
               (charms:write-string-at-point charms:*standard-window*
                                             "こんにちは世界"
                                             0
                                             0)
               (charms:refresh-window charms:*standard-window*)
               (case c
                 ((#\q #\Q) (return)))))))