Java Charset支持所有符号,每个符号使用8位,每个符号的范围为[0-255]

时间:2014-03-15 22:29:36

标签: java unicode utf-8 character-encoding non-ascii-characters

我正在尝试传递一个字节数组,其中包含每个元素0 to 255范围内的任何数据。

我必须将其传递给Javascript,因此我将其转换为字符串,但有些字符会丢失并替换为0x3F Question Mark

支持所有8位符号转移到Javascript的正确Charset是什么。

public String base64Decode(String s) {
  //... lots of stuff transforming String into byte array.

  //Some example bytes shown here.
  byte[] destArray = {(byte)0xf3, (byte)0xc3, 00, 01, 00, 00, 00, 00, (byte)0xc3, (byte)0x63, (byte)0x2d, 00, 00, 00, 00, 00, (byte)0xe0, (byte)0x9d, (byte)0xea};
  System.out.println(new String(destArray, Charset.forName("UTF-8")));
  return new String(new String(destArray, Charset.forName("UTF-8")));
}

我使用批处理脚本

将System.out.println输出到文件中
java Test > out.bin

然后逐字节比较以查看丢失的内容 总结0x9D变为0x3D这是错误的 可能还有其他人,但我没有检查整个文件的大小超过2兆。

默认new String(destArray);做得更好,但仍然错过了几个字符。

2 个答案:

答案 0 :(得分:2)

您可以使用ISO-8859-1

然而,这是一个丑陋的黑客攻击,只有当某些东西真的阻止你使用正确的数据类型时(例如使用byte[]表示二进制数据),才能使用它。

从常识来看,base64是一种将二进制数据表示为ASCII字符串的方法,因此base64Decode()应该使用String并返回byte[]

答案 1 :(得分:0)

你不能盲目地使用你想要的任何字符集。 Java和Javascript中的字符串使用UTF-16。将base64数据解码为字节数组后,您必须知道这些字节实际表示的确切字符集,以便它们可以正确转换为UTF-16而不会丢失任何数据。您必须知道数据是base64编码时使用的字符集。如果你不知道确切的字符集,你会留下启发式分析或只是简单的猜测,而且两者都不够可靠。双方必须提前就共同的字符集达成一致,否则字符集需要与base64数据一起交换。