6

作業中のBlackberryプロジェクトがあり、UTF-16LE(リトルエンディアン)を使用してエンコードされた文字列のバイト配列を、UTF-16BE(ビッグエンディアン)エンコードの文字列のバイト配列に変換する必要があります。その逆。接続しているサーバーは、BlackBerryデバイスにUTF-16LEエンコーディングの文字列のバイト配列を送信していますが、デバイスはUTF-16LEをネイティブにサポートしていません。バイト配列を文字列にデコードしようとすると、文字列が判読できなくなります。ただし、このデバイスはUTF-16BEをサポートしています。また、このプロセスを逆にする必要があります。つまり、UTF-16BEエンコーディングを使用した文字列のバイト配列をサーバーが期待するもの(UTF-16LE)に変換します。ありがとう。

デバイスでこれを行うことはできません:

String test = "test";
byte[] testBytes = test.getBytes("UTF-16LE");// throws UnsupportedEncodingException

私はこれを行うことができます:

String test = "test";
byte[] testBytes = test.getBytes("UTF-16BE");//works
4

1 に答える 1

11

UTF-16はコードユニットごとに2バイトを使用し、一部のUnicodeコードポイントは1つのコードユニットを使用してエンコードされ、他のコードポイントは2つのコードユニット(サロゲートペアと呼ばれます)を使用してエンコードされます。

UTF-16LEとUTF-16BEの間で変換するには、各コードユニットの各2バイトペアの順序を入れ替えるバイトをループするだけです。代理コードユニットの順序は、LEとBEの間で変わりません。IOW、バイト0と1を相互に交換し、バイト2と3を相互に交換します。

于 2012-08-24T01:49:12.353 に答える