【问题标题】:Java comparator for String in EBCDIC encodingEBCDIC 编码中字符串的 Java 比较器
【发布时间】:2014-07-02 07:14:33
【问题描述】:

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

我用谷歌搜索了一些,然后我发现了 link from IBM已经按顺序列出了字符

我意识到 EBCDIC 排序与普通的 java 字典排序完全相反(至少对于我要处理的数据类型而言)。

我的问题是我的认识对吗?如果不是我错过了什么?或者是否有任何可用于 EBCDIC 编码的 java 比较器。

【问题讨论】:

    标签: java comparator ebcdic


    【解决方案1】:

    由于 char 类型在 Java EBCDIC 中隐式为 UTF-16,因此需要将其作为 Java 字节数组进行比较。

    例子:

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

    【讨论】:

    • 根据IBM's EBCDIC docs,标点符号应该小于字母。但是上面的方法结果相反。我在按照您推荐的方式实现它时注意到的是,EBCDIC 中的前 128 个字符被赋予了更高的值,而接下来的 128 个字符得到了更低的值。这可能是因为在 Java 中对编码字节进行了签名吗?如果是这样,我该如何解决这个问题?如果没有,我还缺少什么?
    • 是的,这是因为字节是用 Java 签名的。字节 128 -> 255 被视为
    【解决方案2】:

    您不应该花太多时间弄清楚 EBCDIC 的许多特性。鉴于您的问题范围有限,实现您的要求的简单方法如下:

    • 实现一个辅助方法,该方法读取 EBCDIC 并以 Java 的本机编码 (UTF-16) 生成 java.lang.String
    • 实现一个辅助方法,该方法采用 Java 的本机编码 (UTF-16) 中的 java.lang.String 并生成 EBCDIC 编码的字符串
    • 使用第一种方法读取数据。根据需要排序并进行其他处理。使用第二种方法将数据写入大型机。

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

    【讨论】:

    • 感谢您的回答。您能否在您写的第 1 点提供帮助。例如:我从 UI 收到的字符串为 "11AA" 。现在你能告诉我如何继续
    • @Akshay 创建一个ByteBuffer 并用 EBSDIC 字节填充它。使用Charset.forName("IBM1047") 为EBSDIC 制作Charset。在您的 Charset 对象上使用 encodedecode 以与 EBSDIC 相互转换。
    【解决方案3】:

    是的,有一个用于 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())));         
            }     
          };   
    

    【讨论】:

      猜你喜欢
      • 2013-08-13
      • 1970-01-01
      • 2011-11-08
      • 1970-01-01
      • 2015-06-23
      • 2011-05-03
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多