2017-08-25 75 views
0

我的java程序正在試圖讀取一個文本文件(主VSAM文件轉換爲平面文件)。我相信這意味着,文件以EBCDIC格式編碼。如何在不損壞Java String的情況下存儲EBCDIC(IBM-1047)編碼文本?

我正在使用com.ibm.jzos.FileFactory.newBufferedReader(fullyQualifiedFileName, ZFile.DEFAULT_EBCDIC_CODE_PAGE);來打開文件。

並使用String inputLine = inputFileReader.readLine()來讀取一行並將其存儲在一個java字符串變量中進行處理。我讀取存儲在String變量中的文本變爲unicode。

如何確保存儲在java字符串變量中的內容不會損壞?

+0

引用塊(以'>'爲前綴)不用於強調,它們用於引用外部源或其他問題或答案。 –

+4

如果您在該BufferedReader上選擇了正確的編碼,則不會有任何損壞。轉換爲Unicode(這必須發生在Java字符串中)是無損的。 – Thilo

回答

1

如果您已經閱讀了正確字符集的文件(這裏是最大的假設),那麼Java本身在內部使用Unicode並不重要,Unicode包含EBCDIC的所有字符。

字符集指定字符(碼點)和一個或多個字節之間的映射。一個文件只不過是一個字節流,如果你應用了正確的字符集,那麼右側的字符就映射到了內存中。

假設字節1映射到字符集X中的'A'和UTF-16中的字節0和65,然後使用字符集X讀取包含字節1的文件將使系統讀取字符'A',甚至如果內存中的系統使用字節0和65來存儲該字符。

但是,沒有辦法知道您是否使用了正確的字符集,除非您現在明確指出實際結果應該如何。

3

字符集解碼器會將字節映射到正確的字符串Unicode。反之亦然。

唯一的問題是BufferedReader.readLine會刪除行尾(也是EBCDIC行尾NEL字符,\u0085也是一個公認的Unicode換行符)。所以在寫入時自己編寫NEL,或者設置系統行分隔符屬性。

用256個EBCDIC字符編寫單元測試並來回轉換它們並不容易。

相關問題