2017-08-25 8 views
0

私のJavaプログラムがテキストファイル(メインフレームVSAMファイルをフラットファイルに変換)を読み込もうとしています。これは、ファイルがEBCDIC形式でエンコードされていると私は信じています。EBCDIC(IBM-1047)エンコーディングテキストをJava Stringに格納せずに格納する方法はありますか?

私はcom.ibm.jzos.FileFactory.newBufferedReader(fullyQualifiedFileName, ZFile.DEFAULT_EBCDIC_CODE_PAGE);を使用してファイルを開きます。

を使用し、String inputLine = inputFileReader.readLine()を使用して行を読み取り、処理のためにjava文字列変数に格納します。文字列変数に格納されているときにそのテキストがユニコードになるのを読んでいます。

Java文字列変数に格納するときにコンテンツが破損しないようにするにはどうすればよいですか?

+0

引用符ブロック( '>'の前に付いているもの)は、強調表示ではなく、外部ソースからの引用やその他の質問や回答のためのものです。 –

+4

BufferedReaderで正しいエンコーディングを選択すると、何も破損しません。 Unicodeへの変換(Java文字列の場合に起こらなければならない)は無損失です。 – Thilo

答えて

1

正しい文字セット(ここで一番大きな前提)でファイルを読んでいれば、Java自体がUnicodeを内部的に使用しても問題はありません。UnicodeにはEBCDICのすべての文字が含まれています。

文字セットは、文字(コードポイント)と1つ以上のバイトの間のマッピングを指定します。ファイルはバイトのストリーム以外のものではありません。正しい文字セットを適用すると、正しい文字がメモリにマップされます。

バイト1が文字セットXで 'A'にマッピングされ、バイト0と65がUTF-16でマッピングされると、文字セットXを使用してバイト1を含むファイルを読み込むと、システムは文字 'A'メモリ内のそのシステムがその文字を格納するためにバイト0と65を使用する場合

しかし実際の結果が具体的でなければ、正しい文字セットを使用したかどうかを知る方法はありません。

3

Charset Decoderは、バイトを文字列の正しいUnicodeにマップします。およびその逆。

唯一の問題は、BufferedReader.readLineが行末(EBCDIC行末のNEL char、\u0085 - 認識されたUnicode改行文字)を削除することです。したがって、書いているときにNELを自分で書いたり、System line separatorプロパティを設定したりしてください。

256個のEBCDIC文字で単体テストを書いて前後に変換するのは簡単ではありません。

関連する問題