如何使用 ISO-8859-6 字符集将十六进制代码编码为字符串?

How to encode hexadecimal code to string using ISO-8859-6 charset?

我知道还有其他线程可以回答这个问题,但对我来说,有点不同。

我有很多二进制文件,其中包含需要显示的不同类型的数据(ASCII、十六进制 ..)。

所以我显示 ASCII 值的常用方法是使用 StandardCharsets class 中包含的 ISO-8859-1。可悲的是它不支持原生 iso-8859.6 需要显示阿拉伯字符。 以下是我用于编码的方法:

第一种方法给我十六进制代码作为字符串:

public static String hexField(byte[] record, int offset, int length) {
     StringBuilder s = new StringBuilder(length * 2);
     int end = offset + length;

     for (int i = offset; i < end; i++) {
         int high_nibble = (record[i] & 0xf0) >>> 4;
         int low_nibble = (record[i] & 0x0f);
         s.append(hex_table[high_nibble]);
         s.append(hex_table[low_nibble]);
         
     }

     return s.toString();
}

第二种方法:使用前一种方法显示ASCII字段:

private static String asciiField(byte[] record, int offset, int length) throws UnsupportedEncodingException {
    String field = hexField(record, offset, length) ; 
    
    byte[] fieldByte = javax.xml.bind.DatatypeConverter.parseHexBinary(field);
    return new String(fieldByte,StandardCharsets.ISO_8859_1).trim() ;
}

如何显示用 iso-8859.6 编码的阿拉伯字符,谢谢!

虽然 不需要 Java SE 标准支持 ISO-8859-6(因此在 StandardCharsets), 我相信它得到了广泛的支持。

要使用它,只需在需要字符集的地方使用字符串常量 "ISO-8859-6",例如将包含 ISO-8859-6 数据的 byte[] 转换为 String , 只需使用

byte[] byteData = {(byte) 0xC2, (byte) 0xD4, (byte) 0xD8};
String s = new String(byteData, "ISO-8859-6");

这在我的机器上运行得很好。 (该示例中的 byteData 几乎肯定包含乱码,因为我不懂任何阿拉伯语,但它 确实 代表 ISO-8859-6 中的一些阿拉伯字符)。

或者,如果您想要一个实际的 Charset 对象,您可以使用 Charset.forName("ISO-8859-6")。这样做还会将 UnsupportedEncodingException 移动到调用 Charset.forName 的位置,并且不会在每个 byte[]-to-String 转换位置乱扔垃圾。

另请注意,hexField 似乎与 parseHexBinary 完全相反,因此将这两种方法链接在一起是毫无意义的 byte[]->十六进制表示->byte[] 转换链。甚至还有一个 String 构造函数,它带有您可以使用的偏移量和长度:

private static final Charset ISO_8859_6 = Charset.forName("ISO-8859-6");

private static String textField(byte[] record, int offset, int length) {
    return new String(record, offset, length, ISO_8859_6).trim() ;
}