java.lang.String
との間でUTF-16バイト配列をエンコード/デコードする必要があります。バイト配列はByte Order Marker (BOM)で私に与えられ、BOMを使ってバイト配列をエンコードする必要があります。UTF-16LEバイト配列をBOMでエンコード/デコードするにはどうすればよいですか?
また、私はMicrosoftクライアント/サーバーを扱っているため、誤解を避けるためにリトルエンディアン(LE BOMと一緒に)でエンコーディングしたいと思います。私は、BOMでビッグエンディアンが動作するはずですが、Windowsの世界で上流に泳ぎたいとは思わないことを認識しています。一例として、
、ここでBOMとリトルエンディアンでUTF-16
ようjava.lang.String
をエンコードする方法は次のとおりです。
public static byte[] encodeString(String message) {
byte[] tmp = null;
try {
tmp = message.getBytes("UTF-16LE");
} catch(UnsupportedEncodingException e) {
// should not possible
AssertionError ae =
new AssertionError("Could not encode UTF-16LE");
ae.initCause(e);
throw ae;
}
// use brute force method to add BOM
byte[] utf16lemessage = new byte[2 + tmp.length];
utf16lemessage[0] = (byte)0xFF;
utf16lemessage[1] = (byte)0xFE;
System.arraycopy(tmp, 0,
utf16lemessage, 2,
tmp.length);
return utf16lemessage;
}
Javaでこれを行うための最善の方法は何ですか?理想的には、最初に割り当てられた2つの余分なバイトを持つ新しいバイト配列にバイト配列全体をコピーしないようにしたいと思います。
同じことが、このような文字列を復号化するために行くが、それははるかに簡単な使用していjava.lang.String
constructor:
public String(byte[] bytes,
int offset,
int length,
String charsetName)
ありがとう:
は、ここで私がなってしまったものです!しかし、もう1つの問題は...「UTF-16」を使用するとBig Endianとしてデータがエンコードされますが、BOMが存在するにもかかわらず、Microsoftのデータではうまくいかないと思われます。 JavaでBOMを使ってUTF-16LEをエンコードする方法はありますか?私は本当に探していたものを反映するために私の質問を更新します... –
彼が与えた "この記事を見る"リンクをクリックしてください。基本的には、文字列の先頭に\ uFEFF文字を埋め込み、次にUTF-16LEにエンコードすると、結果は適切なBOMになります。 –
"UnicodeLittle"を使用してください(JREがサポートしていると仮定します - そうでなければ "\ uEFFF" + "私の文字列")getBytes( "UTF-16LE")。 Microsoft APIがBOMを期待していてもビッグエンディアンのデータを処理できないと驚いていますが、BOMを他のプラットフォームよりも使用する傾向があります。空の文字列でテストする - データがない場合は、空の配列を取得することがあります。 – McDowell