如何在Java中对字节数组中的补充unicode字符进行编码?

如何在Java中对字节数组中的补充unicode字符进行编码?,java,android,unicode,tcp,Java,Android,Unicode,Tcp,我正在使用一个InputStream从TCP服务器(用C#写)读取字节到byte[],并使用新字符串(byteArray,“UTF-16LE”)将它们编码成字符串。该方法在基本多语言平面中对字符进行编码,但不处理补充字符 我知道C#中的字节是无符号的,而Java字节是有符号的,补充字符可以由一个或两个unicode值组成 ByteBuffer wrapped = ByteBuffer.wrap(dataBytes); wrapped.order(ByteOrder

我正在使用一个
InputStream
从TCP服务器(用C#写)读取字节到
byte[]
,并使用
新字符串(byteArray,“UTF-16LE”)
将它们编码成字符串。该方法在基本多语言平面中对字符进行编码,但不处理补充字符

我知道C#中的字节是无符号的,而Java字节是有符号的,补充字符可以由一个或两个unicode值组成

        ByteBuffer wrapped = ByteBuffer.wrap(dataBytes);
        wrapped.order(ByteOrder.LITTLE_ENDIAN);
        short noOfSites = wrapped.getShort();

        for(int i = 0; i < noOfSites; i++){
            short siteNo = wrapped.getShort();
            short textLength = wrapped.getShort();
            byte[] textBytes = new byte[textLength];
            wrapped.get(textBytes, 0, textLength);

            for(byte bite : textBytes){
                System.out.print(bite+" ");
            } //just to see what's in the byte array

            String siteText = new String(textBytes, "UTF_16LE");
            System.out.println(siteNo + ": " + siteText);
            siteList.add(new Site(siteNo, siteText));
            publishProgress(siteNo + " - " + siteText);
        }
ByteBuffer wrapped=ByteBuffer.wrapp(数据字节);
包装。顺序(字节顺序。小字节);
short noOfSites=wrapped.getShort();
对于(int i=0;i
在本例中,
dataBytes
是包含从服务器读取的字节的字节数组,
noOfSites
是要从服务器读取的对象数,
siteNo
是ID,
textLength
是包含站点名称的字节数,而
textBytes
是保存这些字节的数组

从服务器接收单词“MÜNSTER”时,读入缓冲区的字节为:
770-3-1780830840690820
。 但是,“Ü”字符无法识别,我想这是由于Java试图(但未能)编码的
-3-1
UTF-16值。我知道在C#中,“Ü”表示为
DC-00
,但我不明白为什么在Java中变成
-3-1
。 任何帮助都将不胜感激。

源代码中没有对“Û”字符进行编码-到达接收器端的序列“-3,-1”,是
0xfffd
-UTF 16 LE编码

如果看不到服务器端代码,就很难判断发生了什么,但这很糟糕。Utf-16可以处理像“Ü”这样的字符,而不需要特别处理。实际上,它甚至不在前256个unicode代码点之外,更不用说在基本多语言平面之外了。(这是一个在许多西方语言中都很常见的字符,甚至在拉丁语中,它怎么可能超出了为世界上所有语言设计的字符平面?)

发生的情况是,从文本到utf-16的用于电汇的代码路径在某一点上被明确指示为任何字符设置替换字符,该字符不仅是ASCII字符(传统unicode代码点0x20-0x7f,其中仅包括未注释的拉丁字符)


要清楚,换句话说:数据正在服务器端被破坏,所有非ASCII匹配字符都可能被压缩为“替换字符”。再多修改客户端代码也不能解决这个问题。

是的,似乎两边的代码太多了,我们看不到另一面。非常感谢!说实话,我甚至还没有看到服务器代码,我犯了一个大错。你说的绝对有道理,因为我也得到了“-3,-1”作为“Ö”字符。