[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00368] Re: 日本語文字コード(UTF8) 環境での動作について
- Subject: [FDclone-users:00368] Re: 日本語文字コード(UTF8) 環境での動作について
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Wed, 06 Apr 2005 00:07:07 +0900
しらいです。
In Message-Id <20050405193808.25680806.26905@nifty.ne.jp>
=?ISO-2022-JP?B?GyRCSXBEZyEhMGw7MBsoQg==?= <HCD02054@nifty.ne.jp>さんwrites:
> どうもはじめまして、TAKETYON こと 武貞一三と申します。
> Linux Zaurusでは、基本的に日本語ファイル名は UTF-8で扱われています。
> その日本語(UTF8)名のディレクトリにターミナル等でカレントを移し FDを起動しよ
> うとすると、No such file or directory と表示され、FDが起動出来ません。
ううむ。Zaurus の場合は起動時に UTF-8 を使うということが確
定されておらず、/etc/fd2rc なり ~/.fd2rc なりで FNAMEKCODE=
utf8 と指定された時点で確定する訳です。
これらの startup file の中では既にある程度の shell として
の動作が期待されるので、その前に current directory くらいは
取得しておく必要があります。
ということは、UTF-8 だと思っていない時点で取得した current
directory 値をどのタイミングで UTF-8 だと認識出来るかが鍵に
なってきますね。
幾つか解決策を考えてみたのですが、FNAMEKCODE なり UTF8PATH
なりが変更される度に動的に変更しないと、期待した動作は得られ
そうにありませんでした。
これは結構コストの大きな作業になるんですが、これらの環境変
数がどのタイミングで変更されるのかが判らない以上、どのタイミ
ングで変更されてもいいように対応するしかありません。
巻末に 2.06c に対する patch を添付しますので試してみて下さ
い。
> また、これと関連する話かどうかは分からないのですが、日本語名ファイル名を引数
> としてアプリケーションを起動する際にもいくつか問題を確認しております。
これはどうしようもありません。何故なら「引数」が filename
だというのは単に操作者の頭の中だけにある事象であって、それを
shell 側で知る術はないのです。
例えば ls(1) や cp(1) なら引数は filename ですが、echo(1)
の場合は filename だと思い込んでコード変換してしまうと期待し
た動作は得られません。
これをクリアするには、全てのコマンドについて幾つめの引数に
filename を記述するといった膨大な DB が必要になり、現実的で
はありません。
この辺りの問題点とその対策については下記 URL でも解説され
ていますので参考にして下さい。
http://hp.vector.co.jp/authors/VA012337/soft/fd/samba.html
# 本当に UTF-8 しか使わないならば、FNAMEKCODE だけではなく
#LANGUAGE や INPUTKCODE も UTF-8 にしてしまうことでこの現象
#は回避出来る筈ですが、UTF-8 を吐く IME って Zaurus で使え
#ましたっけ?
> /etc/fd2rc にて launchの設定を行い、拡張子連動にてアプリケーションに引数を引
> き渡す場合は問題無いのですが、内部コマンド EXECUTE_FILE(x)や EXECUTE_SH(h)等で
> 内蔵シェルを起動しそこから直接アプリケーションに引数を渡そうとすると正常に引き
> 渡りません。
launcher から起動する場合は cursor 位置にあるその文字列が
filename であるということを知ることが出来ます。なので、その
場合は FNAMEKCODE や UTF8PATH の設定に従ってコード変換してい
ます。
---- Cut Here ----
diff -u ../old/FD-2.06c/custom.c ./custom.c
--- ../old/FD-2.06c/custom.c Wed Feb 23 00:00:00 2005
+++ ./custom.c Tue Apr 5 23:31:52 2005
@@ -88,6 +88,12 @@
#ifndef _NOORIGSHELL
extern int dumbshell;
#endif
+extern char fullpath[];
+extern char *origpath;
+extern char *progpath;
+#ifndef _NODOSDRIVE
+extern char *unitblpath;
+#endif
#ifndef _NOCUSTOMIZE
extern int curcolumns;
extern int subwindow;
@@ -153,6 +159,12 @@
u_char type;
} envtable;
+typedef struct _pathtable {
+ VOID_P path;
+ int lang;
+ int isarray;
+} pathtable;
+
#ifdef FORCEDSTDC
#define def_str(n) (envlist[n].def.str)
#define def_num(n) (envlist[n].def.num)
@@ -389,6 +401,16 @@
};
#define ENVLISTSIZ ((int)(sizeof(envlist) / sizeof(envtable)))
+static pathtable pathlist[] = {
+ {fullpath, DEFCODE, 1},
+ {&origpath, DEFCODE, 0},
+ {&progpath, DEFCODE, 0},
+#ifndef _NODOSDRIVE
+ {&unitblpath, DEFCODE, 0},
+#endif
+};
+#define PATHLISTSIZ ((int)(sizeof(pathlist) / sizeof(pathtable)))
+
#ifndef _NOCUSTOMIZE
# ifdef _USEDOSEMU
static CONST devinfo mediadescr[] = {
@@ -563,10 +585,26 @@
VOID evalenv(VOID_A)
{
- int i, duperrno;
+ char *cp, *path, buf[MAXPATHLEN];
+ int i, n, duperrno;
duperrno = errno;
for (i = 0; i < ENVLISTSIZ; i++) _evalenv(i);
+ for (i = 0; i < PATHLISTSIZ; i++) {
+ if (pathlist[i].isarray) path = (char *)(pathlist[i].path);
+ else path = *((char **)(pathlist[i].path));
+ n = getkcode(path);
+ if (n == NOCNV || n == pathlist[i].lang) continue;
+ cp = kanjiconv2(buf, path,
+ sizeof(buf) - 1, n, pathlist[i].lang, L_FNAME);
+ pathlist[i].lang = n;
+ if (cp == path) continue;
+ if (pathlist[i].isarray) strcpy(path, buf);
+ else {
+ free(path);
+ *((char **)(pathlist[i].path)) = strdup2(buf);
+ }
+ }
errno = duperrno;
}
diff -u ../old/FD-2.06c/main.c ./main.c
--- ../old/FD-2.06c/main.c Wed Feb 23 00:00:00 2005
+++ ./main.c Tue Apr 5 23:43:13 2005
@@ -927,6 +927,7 @@
free(origpath);
free(progname);
#ifndef _NODOSDRIVE
+ free(unitblpath);
dosallclose();
#endif
free(progpath);
@@ -1101,9 +1102,9 @@
setexecpath(argv[0], envp);
#ifndef _NODOSDRIVE
# ifdef DATADIR
- unitblpath = DATADIR;
+ unitblpath = strdup2(DATADIR);
# else
- unitblpath = progpath;
+ unitblpath = strdup2(progpath);
# endif
#endif
---- Cut Here ----
しらい たかし