jef4j
はじめに
jef4j は、富士通株式会社のメインフレームで使われていた JEF 漢字コード体系、株式会社日立製作所のメインフレームで使われていた KEIS、日本電気株式会社のメインフレームで使われていた JIPS、といったレガシーな文字コードを Unicode を相互変換するための Java 用 Charset ライブラリです。
このプロダクトは富士通株式会社、株式会社日立製作所、日本電気株式会社とはまったく関係ありませんので各社への問い合わせはご遠慮ください。
JEF漢字コードとは
JEF (JAPANESE PROCESSING EXTENDED FEATURE) は、富士通株式会社のメインフレームで使われていた漢字コード体系です。Unicodeの整備も進んだ今となっては消え行く定めにあるものではありますが、企業の基幹系ではいまだ多数のメインフレームが稼働しているため、既存システムからのデータ移行は現在でも重要な技術です。
1979 年に策定された、と聞くと古臭いと思われるかもしれません。しかし、実際には最新の Unicode でも異体字セレクタを使わないとカバーできない様々な漢字が収録されており、漢字集合としては決して古びたものではありません。富士通社のメインフレームは多くの公共機関でも使われており、その意味で日本の基盤を支える文字コード体系のひとつと言うことができるかもしれません。
残念なことに JEF コード体系は、富士通株式会から正式に公開されたものがありません。そのため、jef4j は次の文献およびインターネット上で手に入るツールを元に作成しています。
- JHT(ホスト連携ツール)SIMPLE版: Windows-31J の範囲は概ねこのツールからマッピングを生成しています。ただし、Windows-31J は JIS83 をベースにしているため、Unicode へのマッピングには不適当な部分があります。jef4j では、字形重視で Unicode にマッピングするなど多々変更を加えています。
 - FACOM JEF 文字コード索引辞書 (1987年/第三版): 拡張漢字についてはこの資料を元にしています。現在では入手困難なため、図書館にて(書籍貸出不可のため)閲覧および著作権法で許可された範囲でコピーしたものを参照し、独自で Unicode へのマッピングを作成しています。
 - Linkexpress 運用ガイド コード変換型の対応表(EUC(S90)系/JEF-EBCDIC系): JIS の字体変更の影響で追加された文字のマッピングがここに記載されています。jef4j では、Unicode との変換を目的としているため字形重視でマッピングしています。
 - Canon F359 ユーザーズガイド:JEF 拡張非漢字のマッピングはこのガイドを元に作成しています。Unicode に該当する記号が存在しないため、変換できない部分があります。
 
また、v0.11.0 で加えた Adobe-Japan1 対応については、安岡孝一さんの成果をベースにしてマッピングを作成しています。
JEF漢字のマッピングは、目検・手作業にて行っておりますので、誤りを発見した場合には Issue や Pull Request にてご連絡をお願いします。
現時点でのマッピングはこちらからご覧いただけます。
JEF 漢字コード体系の構造
JEF漢字コード体系自体は JIS78 (JIS C 6226:1978)に基づく JIS非漢字、JIS第一水準、第二水準からなる標準のコード域と拡張漢字、拡張非漢字と呼ばれる追加のコード域からなる 2 バイトのコード体系です。
| カテゴリ | コード域 | 
|---|---|
| 全角空白 | 0x4040 | 
| 拡張漢字/拡張非漢字 | 0x41A1~0x7FFE | 
| 利用者定義 | 0x80A1~0xA0FE | 
| 標準漢字/標準非漢字 | 0xA1A2~0xFEFE | 
※下位バイトが A0、FF となる領域は使用されません。
JEF 漢字コードの標準漢字/非漢字領域については、PC でも一般的に使われている SHIFT_JIS や EUC-JP 同様 JIS コード体系に基づいてるため概ね互換性があるのですが、 JEF 漢字コード策定後は改定時に参考字体が変更されているため、一部の字体に差異が発生しています。(Cyber Librarian「JIS X 0208およびJIS X 0213の字形・字体の変更点」が詳しい) 具体的には、JEF 漢字コードは、JIS78 (JIS C 6226:1978) に基づいているのに対し、SHIFT_JIS などは、JIS83 (JIS X 0208:1983) に基づいているため、一部の字体やコード域に違いがあります。これは、JIS83 策定の翌年に策定された改訂版の JEF84 では、従来の領域には変更を加えず、変更された字体を拡張漢字領域に配置し上位互換性が保つ方針をとったためと思われます(ただし、理由は不明ですが、JEF79 の時点で JIS83 の字体になっていた文字が存在するためすべての文字が追加されているわけではないようです)。
| JEF | 元規格など | 
|---|---|
| JEF79 | JIS78 + 拡張漢字/非漢字 | 
| JEF84 | JIS78 + 拡張漢字/非漢字 + JIS83追加/変更字体 | 
拡張漢字/拡張非漢字の領域には、JIS第三、第四水準でもカバーできない多数の文字が収録されています。そのため PC から利用する場合には、追加の拡張漢字サポート製品を購入する必要があります。このような事情から、JEF漢字のサポートをうたうツールであっても、拡張漢字/拡張非漢字については、外字登録が必要など限定的なサポートしかされないことが多いようです。
1 バイト文字との併用
JEF漢字コード体系には半角英数や半角カナは含まれません。そのため、メインフレームではよく使われる EBCDIC という1バイト文字体系と併用して使われます。
EBCDICのコード体系としては、IBM-EBCDIC 相当のもの、半角カナを追加した日立製作所 EBCDIK 相当のもの、US-ASCII との整合性を重視したマッピングの3種類が存在します。これらはいずれも 1 バイトのコード体系ですが、SHIFT_JIS や EUC-JP とは異なり JEF 漢字コードとコード域が重なるため両方を同時に使うことはできません。このため、シフトコードを使って1バイトコード体系と2バイトコード体系の切り替えを行います。
| コード名 | カテゴリ | コード値 | 備考 | 
|---|---|---|---|
| Kシフト | シフトアウト(12pt) | 0x28 | |
| K1シフト | シフトアウト(9pt) | 0x38 | エンコード時は 0x28 を使用します。 | 
| Aシフト | シフトイン | 0x29 | 
Unicode にマッピングできない文字の扱い
日本の漢字コード体系の基本となっている JIS 漢字コード体系は、文字の標準化だけを行っており、字形の違いは表示上の問題であるとの方針で作成されています。そのため、例示される字形はたびたび変更されています。Unicode も同様にすべての字形にユニークな番号を振るのではなく、包摂基準に基き複数の字体を CJK 統合漢字に統合しています。そのため、いわゆる異体字については、異体字セレクタという別の仕組みを用いて表現する必要があります。
例えば、JEF では、二点しんにょうの「辻󠄃(C4D4)」と一点しんにょうの「辻󠄂(67A5)」が別のコードとして登録されていますが、Unicode ではいずれも「辻(U+8FBB)」にマッピングされます。異体字セレクタを用いると、「辻󠄃(U+8FBB_E0102)」および「辻󠄂(U+8FBB_E0103)」という形で意図した字形で表示することができるようになります。
jef4jでは、デコード(JEF → Unicode)時については、この異体字セレクタも含めた形での変換も可能になっています。 (Java NIO Charset API の制約のため、エンコードに関しては対応できませんでした)
現時点で、以下のコードを除き、すべてのコードが正しくマッピングされた状態となっています。
- IVD汎用電子の異体字セレクタでも表現できない異体字2文字(顛、儲)⇒ 字形が近い異体字にマッピング
 - 変体仮名 ⇒ 詳細不明な一文字を除き、字形が近い異体字にマッピング
 - 一部のグラフ図形など特殊記号 ⇒ FFFD にマッピング
 - 一部の縦書き文字 ⇒ FFFD にマッピング
 
利用者定義領域の取り扱い
JEF の利用者定義文字 3102 文字は、Unicode 私的利用領域 E000~EC1D にマッピングされます。
KEIS 漢字コードとは
KEIS (KANJI EXTENDED INFORMATION PROCESSING SYSTEM) は株式会社日立製作所のメインフレームで使われていた漢字コード体系です。
KEIS 漢字コード体系の構造
KEIS 漢字コード体系は、JIS78 (JIS C 6226:1978)に基づく KEIS-78 と JIS83 (JIS X 0208:1983) に基づく KEIS-83 の2つから構成される2バイトコード体系です。JEF や JIPS が JIS83 での字体変更に対し既存コード体系の拡張(字体変更された文字を別コードで追加)する方式を選んだのに対し、KEIS は漢字コード体系自体が変更されています。
KEIS 漢字コード体系の構造
| カテゴリ | コード域 | 
|---|---|
| 全角空白 | 0x4040 | 
| 拡張文字セット2 | 0x59A1~0x80FE | 
| 利用者定義 | 0x81A1~0x9EFE、0xA0A1~0xA0FE | 
| 拡張文字セット3 | 0x9FA1~0x9FFE | 
| 基本文字セット | 0xA1A1~0xCEFE | 
| 拡張文字セット1 | 0xD1A1~0xFEFE | 
基本文字セットは JIS 第一水準、拡張文字セット1は JIS 第二水準の JIS コード体系に 0x8080 加算したものであるため、結果的に EUC-JP と互換性があります(特に字体変更のない KEIS-83 はそのままです)。
拡張文字セット2、拡張文字セット3 については、情報がなく対応できておりません。情報をお持ちの方はissues までご連絡いただけますと幸いです。
KEIS と EBCDIC/EBCDIK の併用
KEIS 漢字コード体系には半角英数や半角カナは含まれませんので EBCDIC/EBCDIK と併用して使われます。EBCDICはASCIIとは異なり8bit体系でありコードが重なるため、シフトコードを使って1バイトコード体系と2バイトコード体系の切り替えを行う必要があります。
| コード名 | カテゴリ | コード値 | 
|---|---|---|
| 全角シフト | シフトアウト | 0x0A42 | 
| 半角シフト | シフトイン | 0x0A41 | 
KEIS の利用者定義領域の取り扱い
KEIS の利用者定義文字は2パートに分かれますが、Unicode 私的利用領域には以下のようにマッピングされます。
- 0x81A1~0x8FFE (3677文字): E000~EE5D
 - 0xA0A1~0xA0FE (93文字): EE5E~EEBA
 
KEIS に関する資料
- Interstage Charset Manager Standard Edition V9 使用手引書 C.8 KEISコード系の概要
 - 文字コード表 日本語EUC(euc-jp)
 - OpenTP1 Version 7 マニュアル
 - PRINT DATA EXCHANGE - Form Designer マニュアル
 
JIPS 漢字コードとは
JIPS (Japanese Information Processing System) とは日本電気株式会社のオフコンで使われていた漢字コード体系です。 JIPS には、JISコード配列をそのまま採用した JIPS(J) と JISコードを EBCDIC 範囲にマッピングした JIPS(E) があります。
JIPS 漢字コード体系の構造
JIPS 漢字コード体系は 2バイトの各バイトを2分割ずつにした4領域で定義され、それぞれ G0~G3集合と呼ばれます。 そのうち G0集合については、JIS78 (JIS C 6226:1978) の JISコード配列がそのまま配置されます。
| カテゴリ | コード域 | 
|---|---|
| G0集合 | 0x2121~0x7E7E | 
| G1集合 | 0xA1A1~0xFEFE | 
| G2集合 | 0xA121~0xFE7E | 
| G3集合 | 0x21A1~0x7EFE | 
なおG0、G1集合のうち下記範囲は外字領域として定義されています。
| カテゴリ | コード域 | 
|---|---|
| G0外字領域 | 0x7421~0x7E7E | 
| G1外字領域 | 0xE021~0xFEFE | 
G1~G3集合 については、情報がなく部分的な対応に留まっています。情報をお持ちの方はissues までご連絡いただけますと幸いです。
JIPS と EBCDICカナ文字 の併用
JIPS 漢字コード体系には半角英数や半角カナは含まれませんので EBCDICカナ文字と併用して使われます。EBCDICはASCIIとは異なり8bit体系でありコードが重なるため、シフトコードを使って1バイトコード体系と2バイトコード体系の切り替えを行う必要があります。
| コード名 | カテゴリ | コード値 | 
|---|---|---|
| 全角シフト | シフトアウト | JIPS(J):0x1A70、JIPS(E):0x3F75 | 
| 半角シフト | シフトイン | 0x3F76 | 
JIPS の外字領域の取り扱い
JIPSの利用者定義文字は各集合の後半部分に配置されます。複数のパートに分かれるため、Unicode 私的利用領域に以下のようにマッピングされます。
- G0集合 0x7421~0x7D7E (1034文字): E000~E409
 - G1集合 0xE0A1~0xFEFE (2914文字): E40A~EF6B
 
JIPS に関する参考文献
- Interstage Charset Manager Standard Edition V9 使用手引書 C.7 JIPSコード系の概要
 - オフコン練習帳 2バイト文字系の文字コード体系
 - 歴博 REKIHAKU 小形克宏「Windows外字と、その互換性をめぐる争い」
 - PC-9801プログラマーズBible
 - NEC WebOTX Manual V10.1 (第7版)
 
インストール
Maven Central Repository から取得できます。
<dependency>
  <groupId>net.arnx</groupId>
  <artifactId>jef4j</artifactId>
  <version>0.11.0</version>
</dependency>
使い方
jef4j 用に特別なAPIが用意されているわけではありません。クラスパスに jar ファイルを追加すると Java 標準 API を通して使用することができます。
- new String(byte[] chars, Charset charset)
 - String.getBytes(Charset charset)
 - Charset.forName(String charset)
 
Charset charset = Charset.forName("x-Fujitsu-JEF");
String text = new String(bytes, charset);
byte[] bytes = text.getBytes(charset);
指定できる文字セット名は次の通りです。
富士通系文字セット
| 文字セット名 | 説明 | 
|---|---|
| x-Fujitsu-EBCDIC | 富士通 EBCDIC (英小文字)のコード表です。 | 
| x-Fujitsu-EBCDIK | 富士通 EBCDIC (カナ文字)のコード表です。 | 
| x-Fujitsu-ASCII | 富士通 EBCDIC (ASCII) のコード表です。 | 
| x-Fujitsu-JEF | JEF漢字のみのコード表です。Unicodeにマッピングできない異体字は標準字体に縮退変換されます。 | 
| x-Fujitsu-JEF-EBCDIC | 1バイト領域の英小文字用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。Unicodeにマッピングできない異体字はCJK統合漢字に縮退変換されます。 | 
| x-Fujitsu-JEF-EBCDIK | 1バイト領域のカナ文字用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。Unicodeにマッピングできない異体字はCJK統合漢字に縮退変換されます。 | 
| x-Fujitsu-JEF-ASCII | 1バイト領域のASCII互換用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。Unicodeにマッピングできない異体字はCJK統合漢字に縮退変換されます。 | 
| x-Fujitsu-JEF-HanyoDenshi | JEF漢字のみのコード表です。IVD汎用電子の異体字セレクタを合わせて出力します。 | 
| x-Fujitsu-JEF-HanyoDenshi-EBCDIC | 1バイト領域の英小文字用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。IVD汎用電子の異体字セレクタを合わせて出力します。 | 
| x-Fujitsu-JEF-HanyoDenshi-EBCDIK | 1バイト領域のカナ文字用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。IVD汎用電子の異体字セレクタを合わせて出力します。 | 
| x-Fujitsu-JEF-HanyoDenshi-ASCII | 1バイト領域のASCII互換用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。IVD汎用電子の異体字セレクタを合わせて出力します。 | 
| x-Fujitsu-JEF-AdobeJapan1 | JEF漢字のみのコード表です。Adobe-Japan1の異体字セレクタを合わせて出力します。主にPDF用途です。 | 
| x-Fujitsu-JEF-HanyoDenshi-EBCDIC | 1バイト領域の英小文字用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。Adobe-Japan1の異体字セレクタを合わせて出力します。主にPDF用途です。 | 
| x-Fujitsu-JEF-HanyoDenshi-EBCDIK | 1バイト領域のカナ文字用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。Adobe-Japan1の異体字セレクタを合わせて出力します。主にPDF用途です。 | 
| x-Fujitsu-JEF-HanyoDenshi-ASCII | 1バイト領域のASCII互換用 EBCDIC と2バイト領域の JEF 漢字をシフトイン/シフトアウトで切り替えます。Adobe-Japan1の異体字セレクタを合わせて出力します。主にPDF用途です。 | 
| x-Fujitsu-JEF-Reversible | JEF漢字のうち、逆変換(JEF→Unicode→JEF)が可能なコードのみに限定したものです。主にデータ移行用途です。 | 
変換に失敗した場合の置換文字としては、半角/全角空白が使用されます。Windows-31J など他の文字コードでは’?’が使用されますが、シフトイン/シフトアウトでの切り替えがあるため、どちらでも有効な文字として解釈できる半角空白(JEF/EBCDIC併用時は半角空白2文字)に置換しています。
日立系文字セット(ベータ)
| 文字セット名 | 説明 | 
|---|---|
| x-Hitachi-EBCDIC | 日立 EBCDIC のコード表です。 | 
| x-Hitachi-EBCDIK | 日立 EBCDIK のコード表です。 | 
| x-Hitachi-KEIS78 | 日立 KEIS-78 のコード表です。 | 
| x-Hitachi-KEIS83 | 日立 KEIS-83 のコード表です。 | 
| x-Hitachi-EBCDIC-KEIS78 | 日立 EBCDIC + KEIS-78 のコード表です。 | 
| x-Hitachi-EBCDIC-KEIS83 | 日立 EBCDIC + KEIS-83 のコード表です。 | 
| x-Hitachi-EBCDIK-KEIS78 | 日立 EBCDIK + KEIS-78 のコード表です。 | 
| x-Hitachi-EBCDIK-KEIS83 | 日立 EBCDIK + KEIS-83 のコード表です。 | 
NEC系文字セット(ベータ)
| 文字セット名 | 説明 | 
|---|---|
| x-Nec-EBCDIK | NEC EBCDICカナ文字 のコード表です。 | 
| x-Nec-JIPS_J | NEC JIPS(J) のコード表です。 | 
| x-Nec-EBCDIC-JIPS_J | NEC EBCDICカナ文字 + NEC JIPS(J) のコード表です。 | 
ライセンス
Apache License 2.0 で配布します。
以下のマッピングファイルについては CC-O (Public Domain 相当) にて配布いたします。
- src/test/resources/*.json
 
変更履歴
- 2025/8/13 version 0.11.0:
    
- Adobe Japan-1 の IVS を使った変換に対応しました。
 - データ移行を想定し逆変換(JEF→Unicode→JEF)が可能なコードのみに限定した「x-Fujitsu-JEF-Reversible」を追加しました。
 
 - 2025/8/8 version 0.10.2:
    
- 変体仮名のデコード時にエラーが出る問題を修正しました。
 - 迩、珊、悗を縮退する際に標準漢字に戻るよう縮退変換の順序を修正しました。
 - 武を字母とする変体仮名 71E0 を U+1B0D0 にマッピングしました。
 
 - 
    
2025/5/19 version 0.10.1: x-Fujitsu-(EBCDIC EBCDIK ASCII JEF) 指定時にシフトコードがエラーとならず無視される問題を修正しました。  - 2025/5/10 version 0.10.0: 汎用電子指定時のデコードにて異体字セレクタを出力できるよう改善しました。従来と同じ動作にしたい場合は、デコード時に「-HanyoDenshi」が含まれていない文字セットを指定してください。また、「哨󠄁」の異体字セレクタが誤っていたため修正しました。
 - 2021/10/20 version 0.9.3: 「鯵鰺篭籠」のマッピングが間違っていることが判明したため修正しました。
 - 2021/4/27 version 0.9.2: 「棒」のマッピングが漏れていることが判明したため追加しました。
 - 2019/9/20 version 0.9.0: FACOM JEF 文字コード索引辞書 (1987年/第三版) に基づきマッピング等の見直しを行いました。
 - 2018/3/27 version 0.7.2: 拡張非漢字領域にあった漢字部品用コードのマッピングが漏れていたため追加しました。
 - 2018/3/11 version 0.7.1: 字形に対する Unicode 値が不明であった2文字(JEF:6AC6、JEF:48C2)が CJK 統合漢字拡張 B および F に存在することがわかったためマッピングを修正しました。
 - 2018/3/11 version 0.7.0: 「FACOM JEF 文字コード索引辞書 (1980/第二版)」 に基づき拡張漢字領域のコードを追加し、多数のマッピング不備を修正しました。