I have come across a requirement where I need to convert a string to EBCDIC encoding and then sort it. We need to sort it with EBCDIC because the string has to go in mainframe. The string I will sort will have only alphabets in captial and integers only.
I googled it some and then I came across the
link from IBM which has listed the characters in order
What I realized was that EBCDIC sorting is exactly opposite to normal java lexicographic sorting (at least for the type of data which I am going to process).
My question is my realization right ? If not what I am missing ? OR is there any java comparator available for EBCDIC encoding.
Since the char type is implicitly UTF-16 in Java EBCDIC strings need to be compared as Java byte arrays.
Example:
Charset encoding = Charset.forName("IBM1047");
Comparator<String> encComparator = (s1, s2) ->
encoding.encode(s1)
.compareTo(encoding.encode(s2));
You should not spend much time figuring out the many peculiarities of EBCDIC. Given a limited scope of your problem, a simple approach to implementing your requirements is as follows:
- Implement a helper method that reads EBCDIC and produces
java.lang.String
in Java's native encoding (UTF-16)
- Implement a helper method that takes
java.lang.String
in Java's native encoding (UTF-16) and produces an EBCDIC-encoded string
- Use the first method to read the data. Sort and do other processing as needed. Use the second method to write the data to mainframe.
This approach has an advantage that only two pieces of your code need to understand EBCDIC - the one that converts in, and the one that converts out. All other code can use Java system libraries and any libraries that you have for sorting, filtering, searching, and all other processing, without thinking about the EBCDIC encoding at all.
Yes there is a comparator for EBCDIC encoding.Here is the code for it.
`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())));
}
};