[英]Java Charset that supports all symbols using 8 bit per symbol from ranges [0-255] per character
我正在尝试传递一个字节数组,其中包含每个元素0 to 255
之间的任何数据。
我必须将它传递给Javascript,所以我将其转换为字符串,但有些字符丢失并替换为0x3F
Question Mark
。
什么是正确的Charset支持所有8位符号转移到Javascript。
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);
做得更好但仍然错过了几个角色。
您可以使用ISO-8859-1
。
但是,这是一个丑陋的黑客,只有当某些东西真的阻止你使用正确的数据类型(即使用byte[]
作为二进制数据)时才应该使用它。
从常识来看,base64是一种将二进制数据表示为ASCII字符串的方法,因此base64Decode()
应该接受一个String
并返回一个byte[]
。
你不能盲目地使用任何你想要的字符集。 Java和Javascript中的字符串使用UTF-16。 将base64数据解码为字节数组后,您必须知道这些字节实际表示的确切字符集,以便它们可以正确转换为UTF-16而不会丢失任何数据。 您必须知道数据是base64编码时使用的字符集。 如果你不知道确切的字符集,你会留下启发式分析或只是简单的猜测,而且两者都不够可靠。 双方必须提前就共同的字符集达成一致,否则字符集需要与base64数据一起交换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.