[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[FDclone-users:00372] Re: 日本語文字コード(UTF8) 環境での動作について
- Subject: [FDclone-users:00372] Re: 日本語文字コード(UTF8) 環境での動作について
- From: Takashi SHIRAI <shirai@unixusers.net>
- Date: Fri, 08 Apr 2005 02:35:30 +0900
しらいです。
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 ----
しらい たかし