私が使用しているInputStream
に(C#で書かれた)TCPサーバからバイトを読み取るためにbyte[]
、そして使用して文字列にそれらをコードしますnew String(byteArray, "UTF-16LE")
。この方法はうまく基本多言語面での文字をエンコードしますが、補助文字を処理しません。
私は、Javaバイトが署名されているのに対し、C#でバイトが署名されていることを理解し、補助文字は、1つまたは2つの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);
}
この例では、dataBytes
サーバから読み取られたバイトを含むバイト配列があるnoOfSites
サーバから読み取られるオブジェクトの数であるsiteNo
IDであり、textLength
サイトの名前を含むバイトの数であり、そしてtextBytes
保持する配列でありますこれらはバイト。
サーバーからの言葉「ミュンスター」を受信すると、バイトをバッファに読み込むには、次のとおりです77 0 -3 -1 78 0 83 0 84 0 69 0 82 0
。しかし、「U」の文字は、私がダウンしていると仮定しており、認識されない-3 -1
Javaがエンコードしよう(と失敗)していることをUTF-16値。私はC#で、「U」が表されていることを理解しDC-00
、これはなった理由を私は理解していない-3 -1
Javaで。任意の助けいただければ幸いです。
「U」の文字がソースで符号化されていない-あなたのシンク側になっている配列を「-3、-1」であり、0xfffd
- UTF 16 LEは、をコードする置換文字。
サーバー側のコードを見てなければ、何が起こっているかを伝えるのは難しいですが、その悪いです。UTF-16は、その道の外出せずに「U」のような文字を扱うことができます。実際、それははるかに少ない塩基多言語面外でも最初の256のUnicodeコードポイントのうちではありません。(西洋の言語の多くの文字一般的に十分であり、さらにラテン文字。つまり、それはどのようにするために、ホールド文字に設計された平面不足の可能性があり、すべての世界の言語?)
何が起こっていることは、UTF-16ワイヤー転送のためのものにあなたのテキストからのコードパスは、いくつかの点で、明示的にのみ(レガシーUnicodeコードポイント0x20にASCIIではない任意の文字のための置換文字を設定するように指示されていることです-0x7f、単にアクセントのないラテン文字を含みます)。
明確にするために、他の言葉では、:データが破損したサーバー側であること、およびすべての非ASCII文字フィッティングされる可能性の高い「置換文字」にそこに押しつぶされます。あなたのクライアント側のコードにいじるのいかなる量がそれを修正することはできません。