如何使用 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() ;
}
我知道还有其他线程可以回答这个问题,但对我来说,有点不同。
我有很多二进制文件,其中包含需要显示的不同类型的数据(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() ;
}