Java 将以单个空字节结尾的字节数组转换为UTF16编码字符串
我得到了一个字节数组,它携带用UCS-2LE编码的字符串,通常,UCS-2LE字符串中的空字符串终止符将被编码为两个空字节(00 00),但有时只有一个,如下所示:Java 将以单个空字节结尾的字节数组转换为UTF16编码字符串,java,string,utf-16,Java,String,Utf 16,我得到了一个字节数组,它携带用UCS-2LE编码的字符串,通常,UCS-2LE字符串中的空字符串终止符将被编码为两个空字节(00 00),但有时只有一个,如下所示: import java.nio.charset.Charset; import java.util.Arrays; class Ucs { public static void main(String[] args) { byte[] b = new byte[] {87, 0, 105, 0, 110,
import java.nio.charset.Charset;
import java.util.Arrays;
class Ucs {
public static void main(String[] args) {
byte[] b = new byte[] {87, 0, 105, 0, 110, 0, 0};
String s = new String(b, Charset.forName("UTF-16LE"));
System.out.println(Arrays.toString(s.getBytes()));
System.out.println(s);
}
}
此程序输出
[87105110,-17,-65,-67]赢� 我不知道字符串的内部字节数组为什么会增长,以及未知的unicode从何而来。我怎样才能消除它 使用合适的或定制的
忽略最后一个奇数长度字节的黑客会有帮助吗
int bytesToUse = b.length%2 == 0 ? b.length : b.length - 1;
String s = new String(b, 0, bytesToUse, Charset.forName("UTF-16LE"));
是的,这是一种方式:)
getBytes()
使用用户默认的Java字符编码,我们不知道,您也可能不知道。尝试使用已知的、有用的Unicode字符编码(如UTF-16或UTF-8)转储。“有时只有一个”:如果您不喜欢替换字符,您能防止上游出现问题吗(�) 悄悄地表示数据损坏,您可以配置一个字符解码器,而不是抛出一个异常。@TomBlodget谢谢您的提示。上游超出了我的控制,浪费了我的时间!
int bytesToUse = b.length%2 == 0 ? b.length : b.length - 1;
String s = new String(b, 0, bytesToUse, Charset.forName("UTF-16LE"));