Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将以单个空字节结尾的字节数组转换为UTF16编码字符串_Java_String_Utf 16 - Fatal编程技术网

Java 将以单个空字节结尾的字节数组转换为UTF16编码字符串

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,

我得到了一个字节数组,它携带用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, 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"));