6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JEF漢字コードについて調べてみた

Posted at

オンプレで動いている既存システムをAWS上へ移行する際にJEF漢字コードを扱っている箇所があったので調べてみた際のメモ
誰得?な内容です

JEF漢字コードとは?

富士通の大型機で使用されている漢字コード

  • JIS第1、2水準はJISコードに 0x8080 を足したコード
    ただし全角のスペースは 0x4040
  • 漢字には字形重視型と領域重視型の2つを持つものがある(人名などで使用される旧漢字など)
  • 全角文字の開始(KI)には 0x28 or 0x38、全角文字の終了(KO)には 0x29 が用いられる
  • 半角文字はEBCDICを使用している
  • 加えて外字がある

他の漢字コードに変換するには?

ざっと調べた限りでは下の4つしか見当たらなかった

  • 富士通製の商用ソフトなら変換できる(当然)
  • Solarisのiconvはサポートしているらしい
  • Win3.1用のフリーソフト JHTc
  • Java用ライブラリ jef4j

AWS上でどうするか?

上の4つからとなるとJava一択になるが、他のプログラムがJavaではないのでJava以外で実装を考える

JIS第1、2水準はJISコードに 0x8080 を足したコード

これってEUC漢字コードと同じなのでは?
であれば、漢字の箇所だけ iconv でコード変換できそう
全角スペースだけ異なるのでそこは置き換える

漢字には字形重視型と領域重視型の2つを持つものがある

現行システムは Shift_JIS との相互変換を行っているので領域重視型に寄せてしまって問題ないはず
字形重視型の漢字があれば領域重視型に書き換えて iconv で変換
字形重視から領域重視へのマッピングは以下を参考
https://software.fujitsu.com/jp/manual/manualfiles/M070086/J2X15930/01Z200/unyo05/unyo0418.html

半角文字はEBCDICを使用している

これは iconv でやってもいいが、上の2つを処理する際に1byteずつチェックする必要があるため、EBCDIC と ASCII との相互変換のマッピングテーブルを作成して対応
ただし、制御コードはスペースに

EBCDIC -> ASCII
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0D, 0x20, 0x20,
  /*                                                                                CR            */
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x20, 0x0A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  /*                                LF                                                            */
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21,
  /* SPC    。     「     」     、     ·     ヲ     ァ     ィ     ゥ     [     .     <     (     +     ! */
    0x26, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xA0, 0xB0, 0x61, 0x5D, 0x5C, 0x2A, 0x29, 0x3B, 0x5E,
  /*  &     ェ     ォ     ャ     ュ     ョ     ッ           ₋     a     ]    '\'    *     )     ;     ^ */
    0x2D, 0x2F, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x7C, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
  /*  -     /     b     c     d     e     f     g     h     i     |     ,     %     _     >     ? */
    0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70, 0x71, 0x72, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
  /*  j     k     l     m     n     o     p     q     r     `     :     #     @     '     =     " */
    0x73, 0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0x74, 0xBB, 0xBC, 0xBD, 0xBE,
  /*  s     ア     イ     ウ     エ     オ     カ     キ     ク     ケ     コ     t     サ     シ     ス     セ */
    0xBF, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0x75, 0x76, 0xCA, 0xCB, 0xCC,
  /*  ソ     タ     チ     ツ     テ     ト     ナ     ニ     ヌ     ネ     ノ     u     v     ハ     ヒ     フ */
    0x77, 0x7E, 0xCD, 0xCE, 0xCF, 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0x78, 0xD6, 0xD7, 0xD8, 0xD9,
  /*  w     ~     ヘ     ホ     マ     ミ     ム     メ     モ     ヤ     ユ     x     ヨ     ラ     リ     ル */
    0x79, 0x7A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0xDA, 0xDB, 0xDC, 0xDD, 0xDE, 0xDF,
  /*  y     z                                                     レ     ロ     ワ     ン     ゙     ゚ */
    0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  /*  {     A     B     C     D     E     F     G     H     I                                     */
    0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  /*  }     J     K     L     M     N     O     P     Q     R                                     */
    0x24, 0x9F, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
  /*  $           S     T     U     V     W     X     Y     Z                                     */
    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20
  /*  0     1     2     3     4     5     6     7     8     9                                     */
ASCII -> EBCDIC
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x25, 0x40, 0x40, 0x0D, 0x40, 0x40,
  /*                                                              LF                CR            */
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
    0x40, 0x5A, 0x7F, 0x7B, 0xE0, 0x6C, 0x50, 0x7D, 0x4D, 0x5D, 0x5C, 0x4E, 0x6B, 0x60, 0x4B, 0x61,
  /* SPC    !     "     #     $     %     &     '     (     )     *     +     ,     -     .     / */
    0xF0, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0x7A, 0x5E, 0x4C, 0x7E, 0x6E, 0x6F,
  /*  0     1     2     3     4     5     6     7     8     9     :     ;     <     =     >     ? */
    0x7C, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6,
  /*  @     A     B     C     D     E     F     G     H     I     J     K     L     M     N     O */
    0xD7, 0xD8, 0xD9, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0x40, 0x5B, 0x40, 0x40, 0x6D,
  /*  P     Q     R     S     T     U     V     W     X     Y     Z     [    '\'    ]     ^     _ */
    0x79, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75,
  /*  `     a     b     c     d     e     f     g     h     i     j     k     l     m     n     o */
    0x76, 0x77, 0x78, 0x80, 0x8B, 0x9B, 0x9C, 0xA0, 0xAB, 0xB0, 0xB1, 0xC0, 0x6A, 0xD0, 0xA1, 0x40,
  /*  p     q     r     s     t     u     v     w     x     y     z     {     |     }     ~       */
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
  /*        。     「     」     、     ·     ヲ     ァ     ィ     ゥ     ェ     ォ     ャ     ュ     ョ     ッ */
    0x58, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8C, 0x8D, 0x8E, 0x8F, 0x90,
  /*  ₋     ア     イ     ウ     エ     オ     カ     キ     ク     ケ     コ     サ     シ     ス     セ     ソ */
    0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0x9D, 0x9E, 0x9F, 0xA2, 0xA3, 0xA4,
  /*  タ     チ     ツ     テ     ト     ナ     ニ     ヌ     ネ     ノ     ハ     ヒ     フ     ヘ     ホ     マ */
    0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAC, 0xAD, 0xAE, 0xAF, 0xBA, 0xBB, 0xBC, 0xBD, 0xBE, 0xBF,
  /*  ミ     ム     メ     モ     ヤ     ユ     ヨ     ラ     リ     ル     レ     ロ     ワ     ン     ゙     ゚ */
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40,
    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40
加えて外字がある

現行でShift_JIS変換時に外字用マッピングの指定がないので外字はなし

その他の考慮事項

Shift_JISには機種依存文字があるが、現行でJEFコードへの変換時にマッピングの指定がないのでデータ上で使われていないと思われる
EUC_JPとJEFコードで全角記号にズレがあるが、それは個別にマッピングテーブルを作成して変換

まとめ

使用されている漢字コードが限定的(ほとんどのデータがEBCDICで一部しか漢字はなかった)、変換もShift_JISのみなので自作するという手段で対応したが、ちゃんとやるにはjef4jを使ったほうがよさそう

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?