No. 324/622 Index Prev Next
Path: titcca!fgw!kei16!numa
From: numa@kei16.ks.fujitsu.JUNET (NUMATA Toshinori)
Newsgroups: fj.kanji
Subject: Re: name in JIS-78 and JIS-83 (was Re: I want Pascal to C)
Message-ID: < 565@kei16.ks.fujitsu.JUNET>
Date: 20 Oct 88 11:48:36 GMT
References: < KAGOTANI.88Oct14001838@sami.cs.titech.junet> < 1268@ulisvax.ulis.JUNET> < 555@kei16.ks.fujitsu.JUNET> < 557@kei16.ks.fujitsu.JUNET> < 176@tokyo1.ihi.JUNET>
Distribution: fj
Organization: Fujitsu Ltd., Kawasaki, Japan
Lines: 198
専門家 (なんと同じフロアの目と鼻の先にいたんですが) に聞い
てみたところ,1978年版JIS (旧JIS) と1983年版JIS (新JIS) の違
いは以下のとおりだそうです.
・追加された非漢字 (記号など) 71文字
・入れ換えられた漢字 44文字 (22組)
・第二水準の最後に移動した漢字 4文字
・字体が変更された漢字 252文字
字体の変更分は随分たくさんあるようですが,今回問題になって
いる入れ換えと移動については坂本さん@ソニーや椎野さん@IHIの
ご指摘のとおり,[入れ換え22組(44文字)+移動4文字]でいいよう
です.
どこがどう変わったかがわかればプログラムは簡単です.以下の
パッチをnkfのソースにあててください.入力/出力ともJISコード
の場合には,入力データが新JISか旧JISかをエスケープ・シーケン
スから判定し (必要な場合には) 変換を行います.
もともと別のプログラムに組み込んだのを無理やりnkfに突っ込
んだので,なんとなく異様な感じですが,とりあえずは動きます.
ほんとは入力や出力がJIS以外の場合にもそれなりの処理をした
ほうがいいんでしょうが,「それなりの処理」というのはどういう
のがいいんでしょうかね.このプログラムでもコードをunknownに
指定すると一応それなりの処理をしますけど.
*** nkf.c Thu Oct 20 19:56:40 1988
--- xnkf.c Thu Oct 20 19:56:41 1988
***************
*** 57,63 ****
--- 57,70 ----
#define SJ0162 0x00e1 /* 01 - 62 ku offset */
#define SJ6394 0x0161 /* 63 - 94 ku offset */
+ /* character set */
+ #define SET_UNKNOWN 0 /* unknown */
+ #define SET_OLDJIS 1 /* 1978 version JIS kanji */
+ #define SET_NEWJIS 2 /* 1983 version JIS kanji */
+ typedef unsigned short lchar; /* long char which can contain KANJI */
+
+
***************
*** 88,93 ****
--- 95,103 ----
int in_kanji = FALSE,
k_shift = FALSE;
+ int input_set = SET_UNKNOWN; /* input char. set (used for swap) */
+ int output_set = SET_UNKNOWN; /* output char. set (used for swap) */
+
***************
*** 153,158 ****
--- 163,173 ----
}
}
+ if (k_in == '@')
+ output_set = SET_OLDJIS;
+ else
+ output_set = SET_NEWJIS;
+
if (unbuf_f)
setbuf (stdout, (char *) NULL);
else
***************
*** 278,283 ****
--- 293,302 ----
} else {
/* in case of Kanji in ESC sequence */
k_shift = TRUE;
+ if (c1 == '@')
+ input_set = SET_OLDJIS;
+ else
+ input_set = SET_NEWJIS;
continue;
}
} else if (c1 == '(') {
***************
*** 484,491 ****
}
j_oconv (c2, c1)
! register int c2,
! c1;
{
if (c2 == EOF) {
if (in_kanji) {
--- 503,510 ----
}
j_oconv (c2, c1)
! int c2,
! c1;
{
if (c2 == EOF) {
if (in_kanji) {
***************
*** 508,515 ****
--- 527,609 ----
putchar (k_in);
in_kanji = TRUE;
}
+ SWAP(& c2, & c1);
putchar ((c2 & 0x7f));
putchar ((c1 & 0x7f));
}
}
+
+
+
+ lchar swap(), do_swap();
+
+ SWAP(c2p, c1p)
+ int *c2p, *c1p;
+ {
+ lchar x, y;
+
+ x = (((*c2p << 8) & 0xff00) | (*c1p & 0xff)) | 0x8080;
+ y = swap(x);
+ *c2p = (y >> 8) & 0x7f;
+ *c1p = y & 0x7f;
+ }
+
+ lchar
+ swap(c) /* swap JIS78 and JIS83 kanji character */
+ lchar c;
+ {
+ if (input_set == SET_UNKNOWN || output_set == SET_UNKNOWN)
+ return(do_swap(c));
+ if (input_set != output_set)
+ return(do_swap(c));
+ return(c);
+ } /* swap */
+
+ lchar
+ do_swap(c)
+ lchar c;
+ {
+ static lchar swap_table[44][2] = {
+ {0xb0b3, 0xf2cd}, {0xb2a9, 0xf2f4}, {0xb3c2, 0xe9da},
+ {0xb3c9, 0xd9f8}, {0xb3f6, 0xe3de}, {0xb4d2, 0xebdd},
+ {0xb4c3, 0xdef5}, {0xb7db, 0xf0f4}, {0xb9dc, 0xe2e8},
+ {0xbcc9, 0xe9a2}, {0xbfd9, 0xf0d7}, {0xc1a8, 0xeccd},
+ {0xc4db, 0xd4e4}, {0xc5d7, 0xe2ea}, {0xc5ee, 0xdbed},
+ {0xc5f3, 0xdeb9}, {0xc6f6, 0xedee}, {0xc7e8, 0xeaa4},
+ {0xc9b0, 0xdbd8}, {0xcbf9, 0xd0d6}, {0xccf9, 0xe9ae},
+ {0xcfb6, 0xe4c6}, {0xd0d6, 0xcbf9}, {0xdbd8, 0xc9b0},
+ {0xe4c6, 0xcfb6}, {0xe9ae, 0xccf9}, {0xd4e4, 0xc4db},
+ {0xd9f8, 0xb3c9}, {0xdbed, 0xc5ee}, {0xdeb9, 0xc5f3},
+ {0xdef5, 0xb4c3}, {0xe2e8, 0xb9dc}, {0xe2ea, 0xc5d7},
+ {0xe3de, 0xb3f6}, {0xe9a2, 0xbcc9}, {0xe9da, 0xb3c2},
+ {0xeaa4, 0xc7e8}, {0xebdd, 0xb4d2}, {0xeccd, 0xc1a8},
+ {0xedee, 0xc6f6}, {0xf0d7, 0xbfd9}, {0xf0f4, 0xb7db},
+ {0xf2cd, 0xb0b3}, {0xf2f4, 0xb2a9}
+ };
+ static lchar move_table[4][2] = {
+ {0xb6c6, 0xf4a1},
+ {0xcbea, 0xf4a2},
+ {0xcdda, 0xf4a3},
+ {0xe0f6, 0xf4a4}
+ };
+ int i;
+
+ for (i = 0; i < 44; i++) {
+ if (c == swap_table[i][0])
+ return(swap_table[i][1]);
+ }
+ if (input_set == SET_OLDJIS || output_set == SET_NEWJIS) {
+ for (i = 0; i < 4; i++) {
+ if (c == move_table[i][0])
+ return(move_table[i][1]);
+ }
+ }
+ if (input_set == SET_NEWJIS || output_set == SET_OLDJIS) {
+ for (i = 0; i < 4; i++) {
+ if (c == move_table[i][1])
+ return(move_table[i][0]);
+ }
+ }
+ return(c); /* no swap */
+ } /* do_swap */
--
富士通(株) 情報システム事業本部・企画部
Hold on tight to your dream. 沼田 利典 (numa@kei16.ks.fujitsu.junet)
Next
Continue