我的java程序正在尝试读取文本文件(Mainframe VSAM文件转换为平面文件)。我相信这意味着,该文件以EBCDIC格式编码。
我正在使用com.ibm.jzos.FileFactory.newBufferedReader(fullyQualifiedFileName, ZFile.DEFAULT_EBCDIC_CODE_PAGE);
打开文件。
并使用String inputLine = inputFileReader.readLine()
读取一行并将其存储在java字符串变量中进行处理。我在String变量中存储时读取该文本变为unicode。
如何在存储在java字符串变量中时确保内容不被破坏?
答案 0 :(得分:3)
Charset Decoder会将字节映射到String的正确Unicode。反之亦然。
唯一的问题是BufferedReader.readLine将删除行结尾(也是EBCDIC行尾NEL字符\u0085
- 也是可识别的Unicode换行符)。所以在编写时自己编写NEL,或者设置系统行分隔符属性。
没有什么比用256个EBCDIC字符编写单元测试并来回转换它更容易了。
答案 1 :(得分:1)
如果您已经使用正确的字符集读取文件(这是最大的假设),那么Java本身在内部使用Unicode并不重要,Unicode包含EBCDIC的所有字符。
字符集指定字符(代码点)与一个或多个字节之间的映射。一个文件只不过是一个字节流,如果你应用正确的字符集,那么正确的字符就会映射到内存中。
假设字节1映射到' A'在字符集X和UTF-16中的字节0和65中,然后使用字符集X读取包含字节1的文件将使系统读取字符“A”,即使内存中的系统使用字节0和65来存储那个角色。
但是没有办法知道你是否使用了正确的字符集,除非你具体说明实际结果应该是什么。