http://www.2shared.com/document/VqlJ-1wF/test.html
1)这个文件编码的编码是什么? 2)在Java中阅读本文的最佳方法是什么?
目前我有
Scanner scanner = new Scanner(new File("test.txt"), "IBM850");
while (scanner.hasNextLine()) {
buffer = new StringBuffer(scanner.nextLine());
System.out.println("BUFFER = "+buffer.toString());
}
打印很多空值和垃圾。什么是我需要使用的正确编码?
答案 0 :(得分:2)
我在PC和IBM中端系统之间移动数据方面拥有丰富的经验。我可以说这个文件肯定是不是(纯)EBCDIC。每个“行”的开头是 ASCII 字符:
CODE12312345678901502G830918
任何EBCDIC字符匹配该序列的可能性,从不介意所有三条线上的相同序列是无穷小。
我最好的选择是使用二进制数据的ASCII导入(或已经翻译过的EBCDIC)。如果它被翻译,二进制部分几乎肯定已被破坏。
我用十六进制检查后不久可能会有更多信息。
每个“记录”用十六进制0D 0A 0D 0A分隔,它们是一对CRLF序列。
我认为你很可能有一个固定的字段平面文件格式,其中的文本字段为ASCII,其他字段为二进制。
答案 1 :(得分:1)
通常,IBM大型机数据存储在character encodings的区域风格中,如美国的Cp437或多语言Cp870。
答案 2 :(得分:1)
它绝对不是EBCDIC编码的(我花了70年代和80年代在IBM大型机上工作,所以我认识到EBCDIC :-)。它似乎是带有一些二进制组件的ASCII。正确解释这一点的唯一方法是让提供程序为您提供描述每种记录类型(可能有一个或多个)的映射,并指示嵌入式二进制对象的数据类型。
答案 3 :(得分:1)
从它的外观来看,你已经采用了二进制大型机文件,并在将其传输到PC时对其进行了ascii转换。这不起作用。
为了说明出现问题,考虑一个值为64(X'0040')的2字节二进制整数字段,这将被转换为32(x'0020')因为x'40'也是空格字符的EBCIDIC ; ascii转换器将所有EBCIDIC空间转换为ascii空格(x'20')。你真的想要二元和Packed-Decimal字段。
您有两个选择:
我可以告诉你的是,主机上的文件长度为2000字节,包含很多Packed-Decimal字段(Cobol Comp-3)。
我已经解码了第一条记录的前120个字节:
Field start length Value Hex Representation
n0 1 4 CODE 434f4445
n1 5 17 12312345678901502 3132333132333435363738393031353032
n2 22 1 G 47
n3 23 6 830918 383330393138
n4 29 1 V 56
n5 30 3 2470 02470f
n6 33 4 0 0000000f
n7 37 3 2470 02470f
n8 40 2 09 3039
n9 42 5 290502 000290502c
n10 47 5 10842 000010842c
n11 52 5 279660 000279660c
n12 57 5 19072 000019072c
n13 62 5 11488 000011488c
n14 67 5 0 000000000c
n15 72 4 0 0000000c
n16 76 4 0 0000000c
n17 80 7 439914 0000000439914c
n18 87 7 0 0000000000000c
n19 94 7 0 0000000000000c
n20 101 4 7588 0007588c
n21 105 4 7588 0007588c
n22 109 4 0 0000000c
n23 113 4 0 0000000c
n24 117 5 0 000000000c
Where:
Start - Field start (byte number)
length - Field length (in bytes)
Value - Field value
Hex representation - How the field is stored in the file in hex
答案 4 :(得分:0)
使用cp1047字符集,如下所示。
BufferedReader br =新的BufferedReader(新的InputStreamReader(InputStream,“ cp1047”));