繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM