如何在 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) 编码文本而不损坏它?的主要内容,如果未能解决你的问题,请参考以下文章