Skip to the content.

License Maven Central

jef4j

はじめに

jef4j は、富士通株式会社のメインフレームで使われていた JEF 漢字コード体系と Unicode を相互変換するための Java 用 Charset ライブラリです。

JEF漢字コード体系は、Unicodeの整備も進んだ今となっては消え行く定めにあるものではありますが、企業の基幹系ではいまだ多数のメインフレームが稼働しているため、既存システムからのデータ移行は現在でも重要な技術です。

1979 年に策定された、と聞くと古臭いと思われるかもしれません。しかし、実際には最新の Unicode でも異体字セレクタを使わないとカバーできない様々な漢字が収録されており、漢字集合としては決して古びたものではありません。富士通社のメインフレームは多くの公共機関でも使われており、その意味で日本の基盤を支える文字コード体系のひとつと言うことができるかもしれません。

残念なことに JEF コード体系は、富士通株式会から正式に公開されたものがありません。そのため、jef4j は次の文献およびインターネット上で手に入るツールを元に作成しています。

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 漢字コード策定後に発表された 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バイトコード体系の切り替えを行います。

カテゴリ コード値 備考
シフトイン(12pt) 0x28  
シフトイン(9pt) 0x38 エンコード時は 0x28 を使用します。
シフトアウト 0x29  

Unicode にマッピングできない文字の扱い

日本の漢字コード体系の基本となっている JIS 漢字コード体系は、文字の標準化だけを行っており、字形の違いは表示上の問題であるとの方針で作成されています。そのため、例示される字形はたびたび変更されています。Unicode も同様にすべての字形にユニークな番号を振るのではなく、包摂基準に基き複数の字体を CJK 統合漢字に統合しています。そのため、いわゆる異体字については、異体字セレクタという別の仕組みを用いて表現する必要があります。

例えば、JEF では、二点しんにょうの「辻󠄃(C4D4)」と一点しんにょうの「辻󠄂(67A5)」が別のコードとして登録されていますが、Unicode ではいずれも「辻(U+8FBB)」にマッピングされます。異体字セレクタを用いると、「辻󠄃(U+8FBB_E0102)」および「辻󠄂(U+8FBB_E0103)」という形で意図した字形で表示することができるようになります。

jef4jでは、デコード(JEF → Unicode)時については、この異体字セレクタも含めた形での変換も可能になっています。 (Java NIO Charset API の制約のため、エンコードに関しては対応できませんでした)

現時点で、以下のコードを除き、すべてのコードが正しくマッピングされた状態となっています。

利用者定義領域の取り扱い

JEF の利用者定義文字(いわゆる外字)3102 文字は、Unicode 私的利用領域 E000~EC1D にマッピングされます。

インストール

Maven Central Repository から取得できます。

<dependency>
  <groupId>net.arnx</groupId>
  <artifactId>jef4j</artifactId>
  <version>0.9.2</version>
</dependency>

使い方

jef4j 用に特別なAPIが用意されているわけではありません。クラスパスに jar ファイルを追加すると Java 標準 API を通して使用することができます。

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 ASCII互換用 EBCDIC のコード表です。
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汎用電子の異体字セレクタを合わせて出力します。Unicodeにマッピングできない異体字はCJK統合漢字に縮退変換されます。
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汎用電子の異体字セレクタを合わせて出力します。

変換に失敗した場合の置換文字としては、半角/全角空白が使用されます。Windows-31J など他の文字コードでは’?’が使用されますが、シフトイン/シフトアウトでの切り替えがあるため、どちらでも有効な文字として解釈できる半角空白(JEF/EBCDIC併用時は半角空白2文字)に置換しています。

ライセンス

Apache License 2.0 で配布します。

変更履歴