我正在尝试传递一个字节数组,其中包含每个元素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);
做得更好,但仍然错过了几个字符。
答案 0 :(得分:2)
您可以使用ISO-8859-1
。
然而,这是一个丑陋的黑客攻击,只有当某些东西真的阻止你使用正确的数据类型时(例如使用byte[]
表示二进制数据),才能使用它。
从常识来看,base64是一种将二进制数据表示为ASCII字符串的方法,因此base64Decode()
应该使用String
并返回byte[]
。
答案 1 :(得分:0)
你不能盲目地使用你想要的任何字符集。 Java和Javascript中的字符串使用UTF-16。将base64数据解码为字节数组后,您必须知道这些字节实际表示的确切字符集,以便它们可以正确转换为UTF-16而不会丢失任何数据。您必须知道数据是base64编码时使用的字符集。如果你不知道确切的字符集,你会留下启发式分析或只是简单的猜测,而且两者都不够可靠。双方必须提前就共同的字符集达成一致,否则字符集需要与base64数据一起交换。