我遇到了一个需求,需要将字符串转换为EBCDIC编码然后进行排序。我们需要使用EBCDIC进行排序,因为这个字符串必须进入主机。我将要排序的字符串只包含大写字母和整数。
我通过谷歌搜索发现IBM的链接 列出了字符的顺序。
我意识到EBCDIC排序与普通的Java词典排序完全相反(至少对于我要处理的数据类型是这样)。我的问题是我的认识正确吗?如果不是,我错过了什么?或者是否有任何可用于EBCDIC编码的Java比较器。
我遇到了一个需求,需要将字符串转换为EBCDIC编码然后进行排序。我们需要使用EBCDIC进行排序,因为这个字符串必须进入主机。我将要排序的字符串只包含大写字母和整数。
我通过谷歌搜索发现IBM的链接 列出了字符的顺序。
我意识到EBCDIC排序与普通的Java词典排序完全相反(至少对于我要处理的数据类型是这样)。我的问题是我的认识正确吗?如果不是,我错过了什么?或者是否有任何可用于EBCDIC编码的Java比较器。
由于Java中的char类型隐式采用UTF-16编码,因此需要将EBCDIC字符串作为Java字节数组进行比较。
示例:
Charset encoding = Charset.forName("IBM1047");
Comparator<String> encComparator = (s1, s2) ->
encoding.encode(s1)
.compareTo(encoding.encode(s2));
java.lang.String
java.lang.String
并生成EBCDIC编码的字符串这种方法的优点是只有两个代码片段需要理解EBCDIC - 一个用于转换输入,另一个用于转换输出。所有其他代码都可以使用Java系统库以及您用于排序、过滤、搜索和所有其他处理的任何库,而无需考虑EBCDIC编码。
ByteBuffer
,并用 EBSDIC 字节填充它。使用Charset.forName("IBM1047")
创建 EBSDIC 的 Charset
。使用您的 Charset
对象上的 encode
和 decode
进行 EBSDIC 的转换。 - Sergey Kalinichenko是的,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())));
}
};
建议使用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)));