Path: gama!etlcom!kusumoto
From: kusumoto@etlcom.etl.JUNET (Hiroyuki Kusumoto)
Newsgroups: fj.guide.general
Subject: 6.3 kanji code convention in JUNET
Message-ID: <TEBIKI881259756814@etlcom.etl.JUNET>
Date: 12 Feb 88 10:43:29 GMT
Expires: 28 Feb 88 00:00:00 GMT
Sender: kusumoto@etlcom.etl.junet
Reply-To: junet-guide@junet
Followup-To: fj.junet
Distribution: fj
Organization: Electrotechnical Laboratory, Tsukuba Science City
Lines: 440
Approved: fjnews@junet
Posted:  Fri Feb 12 10:46:22 GMT 1988


<1> JUNET での漢字の取り扱い

 [kanji-conventions]

JUNET で使う漢字のコード（系）に関する協約事項については、大筋についてはほぼ
合意されていますが、詳細についてはまだ合意が完全には出来ないままになっていま
す。現在のネットワークにおける漢字コードの協約事項を合意点について述べてみま
した。（漢字に関する議論は、fj.kanji と呼ばれるニュースグループでなされてい
ます。）


また、メールとニュースで使われる漢字についてのおおまかな約束は、「4.4.2 メー
ルとニュースにおける漢字の取り扱い」の項にも説明があります。そちらも参照して
下さい。 




<1,1> JUNETにおける漢字利用の約束



 以下に協約事項を(1)から(11)まであげていきます。これらのうちのいくつかはぜひ
守らなくてはいけません。また、いくつかは、守って欲しいという推奨事項です。


  
 「JUNET における標準の漢字コード」というのは、ネットワークに流すメール、ニ
ュースなどコミュニケーションのためのコードであって、各システムがローカルにど
んなコードを使うかとか、交信する二者間があらかじめ了解した上で用いるコードに
は関知しない。


この「JUNET 標準の漢字コード」によるメッセージについては、ネットワーク上での
伝達が保証されるし、されるべきである。しかし、それ以外のコードを各組織の内部
で使用し、伝達を保証することは特に規制しない。しかし、少くとも組織間の通信に
おいては、このコードの協約を守れるようにしてほしい。

つまり組織の内部で協約以外のコードを使用することは可能であるが、組織からニュ
ースが出る場合には協約のコードに変換すべきであり、かつ、組織へ入る協約のコー
ドを使ったニュースはあらかじめ変換するなどして受理できるようにしなくてはなら
ない。

同様なことは、既知の二者間のメールにもいえる。二者間の伝達経路において、協約
以外のコードの伝達が保証されており、かつ、その確認ができているならば、その二
者間で協約以外のコードを使用することは特に規制しない。しかし、既知の相手でな
く、伝達の保証が確認されていない場合は、協約のコードを使用するべきである。

 
 コミュニケーションのコードは、もはや国内だけの問題ではないので ISO に準拠し
たコード系を使う。（厳密には、図形文字セットとよばれる文字集合の一部を用いる
。これについての詳細は、この章末の参考資料を読んで下さい。）
すなわち、 
    JIS X0201 (C6220) の7単位符号
    JIS X0208 (C6226) の漢字符号系
    JIS X0202 (C6228) の符号拡張法
 
  を使用する。

 
 アナウンサー等は一切省略する。そして、アナウンサーが省略されているものとし
て扱う。


 現在、漢字に関するエスケープシーケンスとしては、
   ESC $ @ , ESC ( J
   ESC $ B , ESC ( B
のいずれをつかってもよい。しかし、


  ESC ( H
は使わない。これについては、必ず別のシーケンスにすること。


【注意】 自分の使っているエスケープシークエンスが何かを知るためには、短い漢
字ファイルを作って、その中を od (octal dump) などで調べて見ましょう。

たとえば、「あいうえお」の平仮名5文字のみが書かれたファイル temp を作ったと
します。 
 
         Unix : od -c temp
        0000000  033  $  @  $  "  $  $  $  &  $  (  $  * 033  (  J
                 ---------                               ---------
          と表示されたら、あなたのシステムでは漢字コードとし
        て JIS を使っており、エスケープシークエンスとしては
        ESC-$-@ と ESC-(-J を使っていることがわかります。

         Unix : od -c temp 
        0000000  202 240 202 242 202 244 202 246 202 250  \n  \n
          と表示されたら、あなたのシステムではシフト JIS  が使
        われています。このままで外に送ってはいけません。
        あなたのシステムの管理者と相談してください。


また、これらの4つのシーケンスのいずれについても、保存して伝達しなければなら
ない。  例えばあるホストでローカルに ESC-$-B は ESC-$-@ とみなすということに
するのは自由であるが、メイル、ニュースをリレーするときに、 ESC-$-B を ESC-$-
@ に書き換えてしまってはいけない。

（ただし、シーケンスの保存については、ホスト間相互に了解がある場合にはその限
りではない。また、保存しなくても当面問題はないのではないかという意見もあった
ことを付記しておく。）

 
 ファイル末では、ASCII/ JIS Roman 選択をして、改行をしてから終る。すなわち、
メッセージの終了は、必ず英字選択（漢字をぬける）をした後でなければならず、か
つ、最後は改行（行を終了している）でなければならない。

 
 いわゆる半角カナは使わない。
  半角カナとは、 JIS X0201 (C6220) の8単位符号のカナのことであり、8ビット目
が1の場合だけでなく、SI、SO によってシフトした場合の半角カナについても同様で
ある。すなわち、半角のカナは使用しない。

また、現在のニュースシステムでは、^O、^Nは、無視するようになっており伝達され
ない。このため、SI、SOを使用して、半角カナを表現しようとしても伝達できないよ
うになっている。    以上から明らかなように、この協約では、7ビットのコードの
みを使用することが前提となっている。

 というのは、伝送経路の一部で8ビットコードが通過できない場合があるからである
。例えば、4.3BSD の sendmail はそのままでは 8ビット目を落としてしまうし、ま
た MH もそのままでは inc の際に8ビット目を落としてしまう。さらに、ニュースシ
ステムも同様である。

 そこで、仮に送り手・受け手の両者ともがシフト JIS を利用できる環境であっても
、8ビットの転送メッセージがそのまま送られると仮定するのは危険である。さらに
、仮にある時点までうまくいっていたとしても中継ホストのバージョンアップによっ
て8ビット伝達が不可能になることもある。十分注意されたい。

さらに、7ビットであっても、制御コード( < 0x20) のすべての伝達が保証されてい
るわけではないので注意されたい。しかし、少くともエスケープ、改行、タブなどの
制御コードについては、伝達は保証されるし、保証しなければならない。    
 一行はエスケープを含め255バイトをこえないこと。  また、これを超過する長い行
については、その伝達を必ずしも保証しない。そのようなメッセージを送った場合に
、転送されなかったり、行が途中で切れたり、その行から後ろの部分が無くなったり
する可能性がある。

（これは、伝達のためのソフトウェアが持つ、メッセージ用の行バッファのサイズの
限界から来る制限です。ワープロで作った文書ファイルを送るときには注意しましょ
う。）

 
 漢字列の中では、改行コードはなるべく使わない方がよい。


行をまたいで漢字を継続する場合でも、改行前に、一旦、英字選択をし、改行後、行
の先頭であらためて漢字選択をするようにする。  （これは less 等の Pager でフ
ァイル中をあちらこちら見て回る人のための配慮です）

 
 [rn-restriction]漢字列の中に（2バイトコードに混じって）タブ、バックスペース
等の制御コードおよびスペース(0x20)が入ることは構わない。ただし、漢字列中に混
在した制御コードが来ても制御できないような端末やソフトウェアを使っている人が
いることを思いやり、混じらないように、改行コードと同様な処理を行う方が好まし
いといえよう。

 
 一行は、画面で、あるいは、ハードコピーをとって読んだ時（つまり、エスケープ
シーケンスを除外し、タブを展開し、バックスペースは戻した時）70-76文字以下で
あることが、なるべく望まれる。


（これは、一行に80字を表示できるディスプレイを仮定し、さらに、漢字の折りかえ
しがあると画面がうまく動作しないものがあることを考慮し、何回か引用され行頭に
数個 '>' などが付加されたメッセージの表示をしても、そうしたディスプレイで行
の折り返しが出ないための配慮です）

 
 日常パソコンなどで使っていても、 JIS で定義されていなかったり、標準化されて
いなかったりする文字・罫線があるので注意すること。

 具体的には： 
  
 JIS 漢字だけを使いましょう。
たとえば、PC9801 等をターミナルとして使っていると、ついローマ数字や、（株）
、丸に数字、といった字を使うことがありますが、これは NEC が拡張した文字で、 
JIS 漢字ではありません。他社のターミナルでは読めませんので使わないように注意
しましょう。  
 罫線素片は使わない。
 JIS 漢字コードには表を書くための部品（罫線素片）がありますが、これはうまく
標準化されていません。端末・パソコンによっては無かったり、あっても漢字コード
がちがっていたりしますので、使わないようにしましょう。  
 第二水準が読めない人もいることを心に留めておきましょう。
 


 
 上記の協約に反したり、各種の制約のある端末やソフトウェアを使用することが多
いホストでは、それに対処したフィルター、ページャーをユーザに対して用意したり
、ニュースやメールのシステムを改良するべきである。

例えば、漢字コード中には一切1バイトコードは混じってはいけないという(8) の制
限については、その制限の制約を受けないように改良されたrnなどのソフトウェアが
 fj.sources などに流れているので、それらをインストールするべきである。また、
 moreは早く捨てて“漢字 less”にすることで、能力を上げるようにするべきである
。  また、ESC-(-H しか受け付けない端末や、シフト JIS しか使用できない端末を
使っているとか、シフト JIS や EUC の日本語UNIXを使用しているホストおよびユー
ザは、外からの JUNET 協約のコードによるメッセージを自分のコードに変換するフ
ィルタや、外へ出す場合のフィルタの作成や、ソフトウェアの改良などを行うべきで
ある。

 自分のホストや端末の制限や特殊事情によって JUNET 全体の利用環境を低下させる
ことにならないように心がけるべきであろう。





【漢字コード変換のソフトウェア】  各種の漢字コード間の変換をするプログラムが
いくつか投稿されています。詳しくは、fj.sources を参照して下さい。
 
 kc (kanji converter) 	和田さん＠東工大作成
 nkf (network kanji filter) 	市川さん＠富士通作成
 
 




<1,2> 参考資料:   複数の図形文字セットの使い方

  （注）　JIS は、旧名称のままにしてあります。


JUNET で漢字のメイルやニュースがとび交っているが、図形文字セットの切り換え方
に誤解もあるようなので次に説明する。更にくわしくは JIS C6228-1984 および bit
 Vol.14 No.6 エディタとテキスト処理(2)を見てほしい。

ASCII や JIS ローマ字、日本語漢字のような文字セットを図形文字セットという。
通常は1文字を7単位（7ビット）（列2〜列 7）の1バイトか2バイトで表現する。（CR
 や ESC などは制御文字といい制御文字セットというものが別に存在する。）

複数の図形文字セットをとっかえひっかえ使いたいときには、これからどの図形文字
セットを使うかを指定しなければならない。この指定は一般的には2段構えになって
いる。沢山の図形文字セットから使おうとするものを一旦 G0 、 G1、G2、G3 のバッ
ファのいずれかに取り出す。この操作を「指示する (designate)」という。バッファ
は新しく別の図形文字セットをそこへ取り出してくると、そこに前にあったものは失
くなる。最大4つの図形文字セットをバッファに取り出しておくことができる。（バ
ッファといっても1バイトの ASCII も2バイトの漢字も入るから不思議である。）次
の操作はバッファのいずれかの図形文字セットを7単位のコード表へ持ち込むことで
、これを「呼び出す (invoke)」という。コード表は7単位環境にはひとつ、8単位環
境には左と右とふたつある。 G0、G1、G2、 G3 から7単位環境のコード表に持ち込む
にはそれぞれ SI (Shift In) 、SO (Shift Out)、LS2 (Locking Shift 2)、LS3 (Loc
king Shift 3) を使う。そこで7単位環境では G0 に JIS ローマ字、G1に JIS 片仮
名を指示しておき、SI でローマ字に切り換え、SO で片仮名に切り換えることができ
る。8単位環境では G0、G1、G2、G3から左のコード表に持ち込むのにそれぞれ LS0 (
Locking Shift 0)、 LS1 (Locking Shift 1)、LS2、LS3 を使う。LS0 と LS1 は SI 
と SO と同じコード (0/15、0/14) である。G1、G2、G3 から右のコード表に持ち込
むにはそれぞれ LS1R (Locking Shift 1 Right) 、 LS2R、LS3R を使う。歴史的理由
で G0 から右に持ち込むことはできない。 
                        7 bit environment
                           ----------
              invoke       | code   |
           --------------->|  table |<---------------
           |               |        |               |
           |            -->|        |<--            |
           |            |  |        |  |            |
           |            |  ----------  |            |
           |            |              |            |
      ----------    ----------    ----------    ----------
      |        |    |        |    |        |    |        |
      |        |    |        |    |        |    |        |
      |   G0   |    |   G1   |    |   G2   |    |   G3   |
      |        |    |        |    |        |    |        |
      |        |    |        |    |        |    |        |
      ----------    ----------    ----------    ----------
           ^            ^
     ESC( B|            |     ESC $ ) @  designate
           |            -----------------------------
           |                                        |
      ----------    ----------    ----------    ----------
      |        |    |        |    |        |    |        |
      |        |    |        |    |        |    |        |
      | ASCII  |    | JIS    |    | JIS    |    | JIS    |
      |        |    |roman   |    |katakana|    |kanji   |
      |        |    |        |    |        |    |1978    |
      ----------    ----------    ----------    ----------



LS2、LS3、LS1R、LS2R、LS3R の制御機能にはどういうコードを使うかというと、 こ
れは ESC Fs シーケンスといってこの順にそれぞれ ESC 6/14、ESC 6/15、ESC 7/14
、ESC 7/13、ESC 7/12 ときめてある。

話を第一段階、指示の仕方に戻す。1バイト7単位の図形文字セットを指示するには取
り出す先が G0、G1、G2、G3 のいずれかに従ってそれぞれ ESC 2/8 F、ESC 2/9 F、E
SC 2/10 F、ESC 2/11 F の形のエスケープシーケンスを使う。F は終端文字 (Final 
character)といい、図形文字セット毎にきまっている。7ビットの図形文字セットで
は



 
----------------------------------
図形文字セット　　 	 F
 ASCII 	 4/2
 JIS 片仮名 	 4/9
 JIS ローマ字 	 4/10
スウェーデン名前用 	 4/8
 
----------------------------------
 
 


従って ASCII を G0 に指示するには ESC 2/8 4/2 とする。 図形文字で表わせば 2/
8 が ( 、4/2 が B だから ESC ( B となる。 JISローマ字を G1 に指示するにのは 
ESC ) J を使う。  複数バイトの指示は G0、G1、G2、G3 に対しそれぞれ ESC 2/4 F
、 ESC 2/4 2/9 F、ESC 2/4 2/10 F、ESC 2/4 2/11 F の形を使うことになっていた
。 G0 だけ形がちがうのは複数バイトがその昔 G0 へしか指示できなかった時代の名
残りである。F の方は、



 
----------------------------------
　　図形文字セット 	F 	 
 
----------------------------------
　　日本語漢字（旧）	4/0 	 　 JIS C6226-1978
　　日本語漢字（新）	4/2 	 　 JIS C6226-1983
　　中国漢字 　　	4/1 	
 
----------------------------------
 
 


となっている。従って 1978 年版の JIS 漢字を G1 に指示するには ESC $ ) @ とな
る。（G0 へ指示するときだけ形が違うのは気持ちが悪いというので、 F=4/3 以降は
 G0 への指示も ESC 2/4 2/8 F とすることになった。）  以上のように、使いたい
図形文字セットをバッファに指示し、コード表へ呼び出して使うのが正式なのだが、
それは面倒という場合には、あるバッファはあるコード表に直結していて、指示した
だけで即使えるという方法もある。それには使う前にアナウンサというのを送る。例
えば ESC 2/0 4/1 を送ると、これは「バッファは G0 しか使わない、そのかわり、G
0 へ指示したものは7単位環境ではすぐコード表へ呼び出す。8単位では G0 へ指示し
たものを左のコード表へ呼び出す」という約束をする。アナウンサにはまだ沢山ある
がそれは JIS C6228 の 8 章を見てほしい。しかし上には上があって、情報交換当事
者間の合意があればアナウンサも省略してよいことになっている。

 そこで JUNET で漢字を使う場合だが、次のようにするのはどうであろうか。当事者
間の合意があったとして ESC 2/0 4/1 のアナウンサがあったように使う。つまり図
形文字セットを切り換えるには常に毎回 G0 への指示からやり直すものとする。そし
て呼び出しの制御機能は使わない。



 
----------------------------------
　　 ASCII へ切り換えるには　 　　 	 ESC ( B 
　　 JIS ローマ字へ切り換えるには 　　 	 ESC ( J 
　　 JIS 漢字 (1978) へ切り換えるには　 	 ESC $ @ 
　　 JIS 漢字 (1983) へ切り換えるには 　 	 ESC $ B 
 
----------------------------------
 



これまで JUNET の漢字ニュースなどで漢字へ入るのは ESC $ @で、出るのは ESC ( 
H といわれたりしていたが、サブルーチンを呼んだり戻ったりするように考えるのは
間違いで、エスケープシーケンスによる切り換えは常に GOTO 文であり、以前何を使
っていたかには関係ないことに注意してほしい。 従って ESC ( H は漢字から出るの
ではなく、1バイトのローマ字へ「行く」という表現が正しい。

しかし、ここにもうひとつの誤りがある。上にあるように JIS ローマ字へ切り換え
るには ESC ( J を使わなければならない。 しかしこれは世の中では間違って ESC (
 H と伝わっている。それは JIS C6228-1975 が制定されたとき、JIS C6220 の片仮
名とローマ字の F はそれぞれ 4/7 と 4/8 になると予想してそう記述してしまった
からである。制定のときには 4/6 までしかきまっていなかったからだ。一方片仮名
とローマ字の F を貰うべく登録手続きをしたのだが、その頃同じく登録手続き中で
あったスウェーデン基本コードとスウェーデン名前用コードが 4/7 と 4/8 を貰い、
日本の片仮名とローマ字は 4/9 と 4/10 になった。そこで JIS C6228-1975 には正
誤表をつけて頒布したが、 このことは徹底しなかった。JIS C6228-1984 の解説の15
ページには正しい表がでているが、 JIS ハンドブックには解説がないからそれだけ
見たのではわからない。

 JIS のローマ字とスウェーデン名前用の文字セットは次の点で字形がちがっている
。スウェーデンのものだけ示す。




----------------------------------
　　2/4 	 $ ではなく一般の通貨記号（太陽マークといわれるもの）
　　4/0 	 大文字E＋アキュートアクセント
　　5/11 	 大文字A＋ウムラウト
　　5/12 	 大文字O＋ウムラウト
　　5/13 	 大文字オングストロームのA
　　5/14 	 大文字U＋ウムラウト
　　6/10、7/11-7/14 	 上のものの小文字
 
----------------------------------
 
 


ついでに ASCII と JIS ローマ字のちがいは次の通り



 
----------------------------------
  	 ASCII 	 JIS ローマ字 
 
----------------------------------
　　5/12 	 ＼ 	 ￥ 
　　7/14 	 ~ （チルド）	 ￣（オーバーライン） 
 
----------------------------------
 
 


この方は軽微な差と思われる。

JUNET のシステムとしては次のように考えるのはどうか。送信側は自分の端末が ASC
II か JIS かにより ESC ( B か ESC ( J を先行させる。受信側は ESC ( B、ESC ( 
J、ESC ( H を見たら受けつける。 ソフト、ハード的に厳密にできるなら、このどれ
を受けたかにより、それぞれの図形文字セットの図形をだす。面倒なら適当に ASCII
 か JIS ローマ字で出力する。大切なことは送信側はスウェーデン名前用を使ってい
ない限り ESC ( H をなるべく早くやめることである。 世の中から大体なくなったと
思ったら受信側も ESC ( Hをはねるようにソフトを変更する。

漢字については次のようにしたい。JIS C6226-1978（旧版）にくらべ 1983 （新版）
は特殊文字が39文字、けい線素片が32文字、漢字が4文字ふえた。旧版しか知らない
端末には新版の端末から困るコードも送られてくるかもしれない。漢字にも第一、第
二水準間で入れ換えがあったが、一応同じ字になっているから読むには困らないであ
ろう。そこで漢字の方も、送信側が自分はどちらの JIS のつもりかをつけて送るこ
とにする。受信側は ESC $ @、ESC $ B のいずれがきてもあわてずに処理をする。規
格協会で売っている16ドット、24ドットの漢字パターンは新版の JIS のものである
。 IBM5550 のコードは旧版である。

制御文字について一言、CR とか ESC とか制御文字はどの図形文字セットが呼び出し
てあるかに関係なく使えるようなコード構造になっている。改行するのに漢字から一
度 ASCII へでなければならないと思っている人もいるようだがこれは誤りである。


以上　出典：　和田英一(wada@tansei.u-tokyo.junet)
