[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[FDclone-users:00368] Re: 日本語文字コード(UTF8) 環境での動作について



 しらいです。

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 ----

                                               しらい たかし