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

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



 しらいです。

In Message-Id <20050407171647.25680806.20828@nifty.ne.jp>
        =?ISO-2022-JP?B?GyRCSXBEZyEhMGw7MBsoQg==?= <HCD02054@nifty.ne.jp>さんwrites:
>  むしろ、内蔵シェル内で扱われる文字コード確認するって上では、ファイルの中身も
> 日本語にしとくべきだったかもしれませんね。

 さすがにその file の中身をどの漢字コードで出力するかまでは
制御し切れません。
 疑似端末を使うなら、出力側の端末 emulation で漢字コード変
換してやって、cat だろうが less だろうがどんな出力もお望みの
漢字コードで表示可能ですけど。

# 疑似端末機能は全然反応が無かったので暫く棚上げ。


>  ただ、ユーザレベルに限って言うのであれば、FDの内部と外部で扱っている文字コー
> ドが変わってしまっていると言うのが、混乱につながるのでは無いかと思います。
>  それはユーザが FDの内部と外部の動作の違いを意識しなければならないと言うこと
> に繋がっちゃうわけですんで。

 そもそも内部コードに UTF8 なんていうケースは全く想定してい
なかったので、この辺りの実装は多分に ad-hoc なものになってし
まっています。
 そのしわ寄せを end user に押し付ける気はないのですが、日本
の漢字コード問題の複雑さがなかなか問題を容易には解決させてく
れないというのもまた事実。
 特に Unicode は扱いが厄介で、漢字コードと glyph 幅との相関
関係を知るために table を用意しないといけないので、行編集の
必要なアプリでは実用的ではないんですよ。
 multi bytes の「半角文字」とか single byte の「全角文字」
とか混在していて訳が判りません。


>  まぁ、贅沢を言えば完全に動的に文字コード判断して、複数のコードを同時に扱える
> のが理想ではあるわけですが(^^;)。

 入出力など複数の interface についてそれぞれ異なる漢字コー
ドを指定しないといけないなんて状況は正常ではないと思います。
I18N な人達ももっと考えてくれないと。
 Zaurus だって Mac OS X だって、内部コードは UTF-8 というこ
とになっていながら標準端末は EUC-JP しか扱えないというちぐは
ぐな設計になっています。
 そんな環境の上で透過的に漢字コードを意識しないで済むアプリ
を用意しようとすると、どうしても訳の判らない設定が必要になっ
てくると思います。


> >  んー meta character の存在は無視するしかないかなー。今の実
> > 装でも「$PATH」とか「\」とかいった名前の file は開けませんも
> > のね。

 あ、これウソでした。ちゃんと開けます。source 良く見たら対
応してありました。


>  このへんが日本語文字コード特有の問題ですね〜。
>  お手間取らせて申し訳ありませんが、どうぞよろしくお願いします。

 実際の採用は先になると思いますが、試験的に「システム標準漢
字コード」を実装する patch を作ってみましたので、暫く使い倒
して様子を見てくれませんか?
 この patch では「標準漢字コード」は UTF-8 に決打ちにしてい
ますが、採用することになったらこの設定用の枠組も用意します。

 launcher 経由、PAGER="less %C" のようにマクロ指定した場合
の launcher 経由、command line からの直接入力、command line
からのマクロ指定、fdsh からの直接入力、等々色んなパターンで
試してみて下さい。

---- Cut Here ----
diff -u ../old/FD-2.06c/kctype.h ./kctype.h
--- ../old/FD-2.06c/kctype.h	Wed Feb 23 00:00:00 2005
+++ ./kctype.h	Fri Apr  8 01:52:38 2005
@@ -259,6 +259,9 @@
 #define	_NOKANJIFCONV
 #endif
 
+#ifndef	_NOKANJIFCONV
+K_EXTERN int defaultkcode K_INIT(UTF8);
+#endif
 #ifndef	_NOKANJICONV
 K_EXTERN int inputkcode K_INIT(NOCNV);
 #endif
diff -u ../old/FD-2.06c/shell.c ./shell.c
--- ../old/FD-2.06c/shell.c	Wed Feb 23 00:00:00 2005
+++ ./shell.c	Fri Apr  8 01:57:56 2005
@@ -517,8 +517,7 @@
 int ignorelist;
 {
 #ifndef	_NOKANJICONV
-	int cnvcode = NOCNV;
-	int tmpcode, cnvptr;
+	int cnvcode, tmpcode, defcode, cnvptr;
 #endif
 	macrostat st;
 	char *cp, *line;
@@ -533,6 +532,7 @@
 	stp -> addopt = -1;
 	stp -> needmark = stp -> needburst = 0;
 #ifndef	_NOKANJICONV
+	cnvcode = defcode = defaultkcode;
 	cnvptr = 0;
 #endif
 
@@ -551,6 +551,10 @@
 			continue;
 		}
 
+#ifndef	_NOKANJICONV
+		if (cnvcode != NOCNV)
+			j = extconv(&line, cnvptr, j, &size, cnvcode);
+#endif
 		len = setflag = 0;
 		switch (c) {
 			case 'P':
@@ -650,16 +654,8 @@
 				}
 
 				i++;
-				if (cnvcode != NOCNV) {
-					j = extconv(&line, cnvptr, j,
-						&size, cnvcode);
-					if (cnvcode == tmpcode) {
-						cnvcode = NOCNV;
-						break;
-					}
-				}
-				cnvcode = tmpcode;
-				cnvptr = j;
+				cnvcode = (cnvcode == tmpcode)
+					? defcode : tmpcode;
 				break;
 #endif	/* !_NOKANJICONV */
 			case '%':
@@ -675,6 +671,9 @@
 		}
 		if (!setflag) flags &= ~(F_NOEXT | F_TOSFN);
 		j += len;
+#ifndef	_NOKANJICONV
+		cnvptr = j;
+#endif
 	}
 #if	defined (_NOEXTRAMACRO) && defined (MAXCOMMSTR)
 	if (j > MAXCOMMSTR) {
diff -u ../old/FD-2.06c/system.c ./system.c
--- ../old/FD-2.06c/system.c	Wed Feb 23 00:00:00 2005
+++ ./system.c	Fri Apr  8 02:06:52 2005
@@ -161,6 +161,10 @@
 extern int loadhistory __P_((int, char *));
 extern int savehistory __P_((int, char *));
 extern int evalprompt __P_((char **, char *));
+# ifndef	_NOKANJICONV
+extern char *kanjiconv2 __P_((char *, char *, int, int, int, int));
+extern char *newkanjiconv __P_((char *, int, int, int));
+# endif
 extern char *histfile;
 extern int savehist;
 #ifndef	_NOEDITMODE
@@ -720,6 +724,11 @@
 #else
 #define	argfputs	fputs
 #endif
+#if	defined (FD) && !defined (_NOKANJIFCONV)
+static int NEAR Kopen __P_((char *, int, int));
+#else
+#define	Kopen		Xopen
+#endif
 static VOID NEAR syntaxerror __P_((char *));
 #if	!MSDOS
 static int NEAR closeonexec __P_((int));
@@ -2622,8 +2631,29 @@
 char *s;
 FILE *fp;
 {
+# ifdef	_NOKANJIFCONV
 	fprintf2(fp, "%a", s);
+# else
+	char *cp;
+
+	cp = newkanjiconv(s, defaultkcode, DEFCODE, L_FNAME);
+	fprintf2(fp, "%a", cp);
+	if (cp != s) free(cp);
+# endif
+}
+
+# ifndef	_NOKANJIFCONV
+static int NEAR Kopen(path, flags, mode)
+char *path;
+int flags, mode;
+{
+	char buf[MAXPATHLEN];
+
+	path = kanjiconv2(buf, path,
+		MAXPATHLEN - 1, defaultkcode, DEFCODE, L_FNAME);
+	return(Xopen(path, flags, mode));
 }
+# endif
 #endif	/* FD */
 
 static VOID NEAR syntaxerror(s)
@@ -4225,7 +4255,7 @@
 		return(rp);
 	}
 	else {
-		rp -> new = newdup(Xopen(tmp, redmode(type), 0666));
+		rp -> new = newdup(Kopen(tmp, redmode(type), 0666));
 		free(tmp);
 		if (rp -> new < 0) return(rp);
 #if	MSDOS && !defined (LSI_C)
@@ -6277,7 +6307,7 @@
 			ret = RET_FAIL;
 		}
 	}
-	else if ((fd = newdup(Xopen(path, O_BINARY | O_RDONLY, 0666))) < 0) {
+	else if ((fd = newdup(Kopen(path, O_BINARY | O_RDONLY, 0666))) < 0) {
 		doperror(NULL, argv[0]);
 		ret = RET_NOTEXEC;
 	}
@@ -8357,7 +8387,7 @@
 #endif
 		return(RET_FAIL);
 	}
-	if ((fd = newdup(Xopen(fname, O_BINARY | O_RDONLY, 0666))) < 0) {
+	if ((fd = newdup(Kopen(fname, O_BINARY | O_RDONLY, 0666))) < 0) {
 		doperror((trp -> comm) -> argv[0], fname);
 		return(RET_FAIL);
 	}
@@ -10888,6 +10918,9 @@
 int shell_loop(pseudoexit)
 int pseudoexit;
 {
+#if	defined (FD) && !defined (_NOKANJIFCONV)
+	char *cp;
+#endif
 	char *ps, *buf;
 	int cont;
 
@@ -10957,6 +10990,12 @@
 			cont = 0;
 			ERRBREAK;
 		}
+
+#if	defined (FD) && !defined (_NOKANJIFCONV)
+		cp = newkanjiconv(buf, DEFCODE, defaultkcode, L_FNAME);
+		if (cp != buf) free(buf);
+		buf = cp;
+#endif
 		cont = exec_line(buf);
 		free(buf);
 		if (pseudoexit && exit_status >= 0) break;
---- Cut Here ----

                                               しらい たかし