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