Java中针对EBCDIC编码的字符串的比较器

4

我遇到了一个需求,需要将字符串转换为EBCDIC编码然后进行排序。我们需要使用EBCDIC进行排序,因为这个字符串必须进入主机。我将要排序的字符串只包含大写字母和整数。

我通过谷歌搜索发现IBM的链接 列出了字符的顺序。

我意识到EBCDIC排序与普通的Java词典排序完全相反(至少对于我要处理的数据类型是这样)。我的问题是我的认识正确吗?如果不是,我错过了什么?或者是否有任何可用于EBCDIC编码的Java比较器。

4个回答

5

由于Java中的char类型隐式采用UTF-16编码,因此需要将EBCDIC字符串作为Java字节数组进行比较。

示例:

    Charset encoding = Charset.forName("IBM1047");
    Comparator<String> encComparator = (s1, s2) ->
            encoding.encode(s1)
                    .compareTo(encoding.encode(s2));

根据IBM的EBCDIC文档,标点符号应该比字母小。但是上述方法得到了相反的结果。我在实现你推荐的方法时注意到,EBCDIC中的前128个字符被赋予更高的值,而后128个字符则得到更低的值。这可能是因为Java中的编码字节是带符号的吗?如果是这样,我该如何解决?如果不是,我还错过了什么吗? - DetourToNirvana
是的,这是因为在Java中字节是有符号的。字节128 -> 255被视为<0,因此<字节0 ..127。 - Bruce Martin

5
您不需要花费太多时间来了解EBCDIC的许多特殊之处。针对您的问题的有限范围,实现您要求的简单方法如下:
  • 实现一个帮助程序,它可以读取EBCDIC并在Java的本地编码(UTF-16)中生成java.lang.String
  • 实现一个帮助程序,它可以接收Java的本地编码(UTF-16)的java.lang.String并生成EBCDIC编码的字符串
  • 使用第一个方法读取数据。根据需要进行排序和其他处理。使用第二个方法将数据写入主机。

这种方法的优点是只有两个代码片段需要理解EBCDIC - 一个用于转换输入,另一个用于转换输出。所有其他代码都可以使用Java系统库以及您用于排序、过滤、搜索和所有其他处理的任何库,而无需考虑EBCDIC编码。


感谢您的回答。您能否帮我解决您所写的第一点?例如:我从UI接收到字符串“11AA”。现在,您可以告诉我如何继续吗? - Akshay
@Akshay 创建一个ByteBuffer,并用 EBSDIC 字节填充它。使用Charset.forName("IBM1047")创建 EBSDIC 的 Charset。使用您的 Charset 对象上的 encodedecode 进行 EBSDIC 的转换。 - Sergey Kalinichenko

1

是的,EBCDIC编码有一个比较器。这是它的代码。

`Comparator<Entity Class name> EBCDIC = new Comparator<Entity Class name>() 

     {  
        Charset encoding = Charset.forName("cp500");

   @Override         
  public int compare(Entity Class name jc1, 
       Entity Class name jc2) {             
          return (int) (encoding.encode(jc1.toString()).compareTo(encoding.encode(jc2.toString())));         
        }     
      };   

0

建议使用Charset.encode(String)并比较生成的ByteBuffer对象。这仅适用于字母和数字,而不适用于标点符号。 这是因为byte的范围是-128到127。高于127的字符将为负数,因此无法与正字节正确比较。

要处理整个字符集,请在比较之前将EBCDIC字节转换回默认字符集中的字符串:

Charset ebcdicCharset = Charset.forName("IBM037");
Comparator<String> ebcdicComparator = Comparator.comparing(
        value -> new String(value.getBytes(ebcdicCharset)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接