Skip to the content.

License Maven Central

jef4j

はじめに

jef4j は、富士通株式会社のメインフレームで使われていた JEF 漢字コード体系、株式会社日立製作所のメインフレームで使われていた KEIS、日本電気株式会社のメインフレームで使われていた JIPS、といったレガシーな文字コードを Unicode を相互変換するための Java 用 Charset ライブラリです。

このプロダクトは富士通株式会社、株式会社日立製作所、日本電気株式会社とはまったく関係ありませんので各社への問い合わせはご遠慮ください。

JEF漢字コードとは

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

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

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

また、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 の制約のため、エンコードに関しては対応できませんでした)

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

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

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 私的利用領域には以下のようにマッピングされます。

KEIS に関する資料

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 私的利用領域に以下のようにマッピングされます。

JIPS に関する参考文献

インストール

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

<dependency>
  <groupId>net.arnx</groupId>
  <artifactId>jef4j</artifactId>
  <version>0.11.0</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 富士通 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 相当) にて配布いたします。

変更履歴

参考文献