mfiler2 続き

日本語ファイル名の表示が少しおかしいです。濁音、半濁音が2文字に分かれて表示されています。

iTerm + GNU screen + mfiler2

「ジ」は1文字で表示されているが、文字幅カウントは半角4文字分。隙間の所は前の文字がそのまま残る。

iTerm + mfiler2

「シ」+「"」の2文字に分かれて表示されており、文字幅カウントは半角4文字分。見た目が悪い以外は特に問題無し。


で、Unicodeって良く知らないんですけど、これは合成文字とかいうやつに違いない、と思って調べてみました。

うーん、かなり複雑みたいですけど、要は、

  • NFC / 正規結合 -- 「が」はUCS2の段階で2バイト
  • NFD / 正規分解 -- 「が」はUCS2の段階で「か」+「"」の4バイト

ということですかね。そして、MacOSXファイルシステムエンコーディングはNFDで正規化されている、と。

のどこに問題があるのかわかりませんけど、とりあえず mfiler2 でファイル名のエンコーディング変換に iconv を呼んでいる箇所を utf8-mac にすればNFCにしてくれるっぽいので、それで良いような気がします。暇を見てやってみます。

まだ少ししか触っていないですけど、他は特に問題無さそうです。

即席パッチ

diff -ru mfiler2-2.6.8c/command.cpp mfiler2-2.6.8b.patched/command.cpp
--- mfiler2-2.6.8c/command.cpp  2007-03-14 16:17:43.000000000 +0900
+++ mfiler2-2.6.8b.patched/command.cpp  2007-03-19 23:19:29.000000000 +0900
@@ -628,6 +628,9 @@
     else if(strcmp(RSTRING(name)->ptr, "utf8") == 0) {
         gKanjiCodeFileName = kUtf8;
     }
+    else if(strcmp(RSTRING(name)->ptr, "utf8-mac") == 0) {
+        gKanjiCodeFileName = kUtf8Mac;
+    }
     else if(strcmp(RSTRING(name)->ptr, "eucjp") == 0) {
         gKanjiCodeFileName = kEucjp;
     }
diff -ru mfiler2-2.6.8c/minato_lib/minato_curses.c mfiler2-2.6.8b.patched/minato_lib/minato_curses.c
--- mfiler2-2.6.8c/minato_lib/minato_curses.c   2007-03-15 20:00:39.000000000 +0900
+++ mfiler2-2.6.8b.patched/minato_lib/minato_curses.c   2007-03-19 23:23:12.000000000 +0900
@@ -49,10 +49,10 @@
 
 vector_obj* gKeyMap = NULL;         // キーマップの動的配列
 
-char gKanjiCodeName[3][256];        // 漢字コードの名前
+char gKanjiCodeName[4][256];        // 漢字コードの名前
 
-char* gKanjiCodeString[4] = {
-    "eucjp", "sjis", "utf8", "unknown"
+char* gKanjiCodeString[5] = {
+    "eucjp", "sjis", "utf8", "utf8-mac", "unknown"
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -144,6 +144,7 @@
     strcpy(gKanjiCodeName[kEucjp], "eucjp");
     strcpy(gKanjiCodeName[kSjis], "sjis");
     strcpy(gKanjiCodeName[kUtf8], "utf-8");
+    strcpy(gKanjiCodeName[kUtf8Mac], "utf-8-mac");
 }
 
 ////////////////////////////////////////////////////////////////////////////////
diff -ru mfiler2-2.6.8c/minato_lib/minato_curses.h mfiler2-2.6.8b.patched/minato_lib/minato_curses.h
--- mfiler2-2.6.8c/minato_lib/minato_curses.h   2007-03-15 20:01:00.000000000 +0900
+++ mfiler2-2.6.8b.patched/minato_lib/minato_curses.h   2007-03-19 23:20:30.000000000 +0900
@@ -74,11 +74,11 @@
 int mkbuf_exist(); // キーボードバッファが存在すれば真を返す
 
 /// 漢字関連関数 ///////////////////////////////////////////////////////////////////////////
-enum eKanjiCode { kEucjp, kSjis, kUtf8, kUnknown };          // 漢字コード
+enum eKanjiCode { kEucjp, kSjis, kUtf8, kUtf8Mac, kUnknown };          // 漢字コード
 extern enum eKanjiCode gKanjiCode;
-extern char* gKanjiCodeString[4];
+extern char* gKanjiCodeString[5];
 
-extern char gKanjiCodeName[3][256];                         // 漢字コードの名前
+extern char gKanjiCodeName[4][256];                         // 漢字コードの名前
 
 extern int is_kanji(unsigned char c);           // 引数が漢字一バイト目かどうか
 extern int is_hankaku(unsigned char c);         // 引数が半角文字一バイト目かどうか
$ echo 'option_kanjicode_filename "utf8-mac"' >>~/.mfiler

ファイル名の表示は直りましたけど、一行編集に入るとダメでした。結構難しいかも。