rogueclone2s のutf8化の進捗

この記事は、Roguelike Advent Calendar 2018 8日目の記事です

rogueclone2s は、
「データ分離版ローグ・クローン2」からフォークした私がメンテナンスしているローグ・クローンです。


内部エンコーディング

「データ分離版ローグ・クローン2」は、utf8普及前に作成された都合で、内部エンコーディングは EUC-JP/ShiftJIS の二つに対応しています。

rogueclone2s はそのフォークであるため、むろんEUC-JP/ShiftJIS です。

しかし、現在の Linux では utf8 がデフォルトのエンコーディングとなっており、コンパイルはできますが、そのまま実行すると文字化けしてしまいます。 (環境変数で EUC-JP とかをしていすると遊べる)


utf8 への修正

そこで utf8 を内部エンコーディングにしようと修正を現在しております。

Unicode を操作するライブラリとして ICU がありますが、utf8 のみならず他のエンコーディングにも対応しているため、 別の機種に移植しようとする時に大変そうなので utf8のみのライブラリを自前で実装することにしました。

ただしutf8の実装は茨の道なので、自分で使う時は素直に ICU を使うのが絶対に良いでしょう。

ぼくが作ったライブラリは、ライブラリは以下です
https://github.com/masoo/mutf8

strcpy っぽい関数 m_utf8_str_cpy
strcat っぽい関数 m_utf8_str_cat
の二つの C 言語のそれぞれの関数をを上書きするものになります
引数が違うためこれをちまちまと修正しているところが現状です


絵文字どうしよう

shitf-jis/euc-jp と utf8 の違いとして一文字のバイト数は固定数ではありせん。
strcpy と strcat は文字を8バイトとして想定して、
文字列を結合したり、コピーします。
なので、可変長の文字列であるutf8だと、中途半端になって文字化けする時があります。

また 固定幅フォントを想定して Ncurese を使っているため、
文字幅の検討しなければいけません。 しかし、これも問題で、コードポイントによってバイト数が違うため、文字幅を決めるための処理が複雑になります。

また絵文字についても大変で既にアスキーに存在する絵文字やまたドコモから移植された絵文字などあります。
それの文字幅は 指定されておりません 日本語では2バイトが標準ですが、フォントによってさまざまになりえるようです。

一部の絵文字幅が1を返す問題

現状は、vim の初期の対応にならって、コードポイントが 0x1f000 のものに、しようと思っています。

本当はフォントを見て幅を決めるべき感じなのですが、処理がとても膨大になりそうなので、どうしようか困っております。