如何在 Java 字符串中存储 EBCDIC (IBM-1047) 编码文本而不损坏它?

Posted

技术标签:

【中文标题】如何在 Java 字符串中存储 EBCDIC (IBM-1047) 编码文本而不损坏它?【英文标题】:How to store EBCDIC (IBM-1047) encoding text in Java String without corrupting it? 【发布时间】:2017-08-25 12:23:35 【问题描述】:

我的 java 程序正在尝试读取文本文件(大型机 VSAM 文件转换为平面文件)。我相信这意味着,文件以 EBCDIC 格式编码。

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

并使用String inputLine = inputFileReader.readLine() 读取一行并将其存储在java 字符串变量中以进行处理。当存储在 String 变量中时,我读取了该文本变为 unicode。

在java字符串变量中存储时如何保证内容不损坏?

【问题讨论】:

如果您在该 BufferedReader 上选择正确的编码,则不会损坏任何内容。向 Unicode 的转换(Java 字符串必须发生)是无损的。 【参考方案1】:

字符集解码器会将字节映射到其正确的字符串 Unicode。反之亦然。

唯一的问题是 BufferedReader.readLine 将删除行尾(也是 EBCDIC 行尾 NEL 字符,\u0085 - 也是公认的 Unicode 换行符)。所以在写的时候自己写 NEL,或者设置 System line separator 属性。

没有什么比用 256 个 EBCDIC 字符编写单元测试并来回转换它们更容易的了。

【讨论】:

【参考方案2】:

如果你用正确的字符集读取了文件(这是这里最大的假设),那么Java本身内部使用Unicode也没关系,Unicode包含EBCDIC的所有字符。

字符集指定字符(代码点)与一个或多个字节之间的映射。一个文件只不过是一个字节流,如果你应用正确的字符集,那么正确的字符就会映射到内存中。

假设字节 1 映射到字符集 X 中的“A”和 UTF-16 中的字节 0 和 65,那么使用字符集 X 读取包含字节 1 的文件将使系统读取字符“A”,即使该系统在内存中使用字节 0 和 65 来存储该字符。

但是没有办法知道您是否使用了正确的字符集,除非您现在明确指出实际结果应该是什么。

【讨论】:

以上是关于如何在 Java 字符串中存储 EBCDIC (IBM-1047) 编码文本而不损坏它?的主要内容,如果未能解决你的问题,请参考以下文章

在将 EBCDIC 转换为十六进制时需要帮助

JAVA 到 EBCDIC 的转换没有发生

EBCDIC 代码页不转换小写“a”

EBCDIC 到 ASCII 无法正常工作

如何让 C 语言中的 ANTLR3.5 生成的解析器在 MVS EBCDIC 环境中工作?

批量--01---写文件补码规则