5

クライアントアプリケーションから送信されたリクエストを処理してUTF8文字列を取得しています。しかし、文字列は実際にはUTF16です。それを私のローカル文字列に入れるにはどうすればよいですか?文字の後に文字が続き\0ますか?その文字列をUTF16に変換する必要があります。

受信した文字列のサンプル: S\0a\0m\0p\0l\0e(UTF8)。
私が欲しいのは:Sample(UTF16)

FileItem item = (FileItem) iter.next();
String field = "";
String value = "";
if (item.isFormField()) {
  try{
    value=item.getString();
    System.out.println("====" + value);
  }
4

2 に答える 2

18

サーバーからのバイトは、のように見える場合はUTF-8ではありませんS\0a\0m\0p\0l\0e。それらはUTF-16です。UTF16バイトを次の方法でJavaに変換できますString

byte[] bytes = ...
String string = new String(bytes, "UTF-16");

または、サーバーからのバイトストリームのエンディアンがわかっている場合は、UTF-16LEまたはを文字セット名として使用できます。UTF-16BE

すでに(誤って)StringUTF-8であるかのようにバイトからを構築している場合は、次の方法でUTF-16に変換できます。

string = new String(string.getBytes("UTF-8"), "UTF-16");

ただし、JB Nizetが指摘しているように、バイトが最初から有効なUTF-8でなかった場合、このラウンドトリップ(バイト->UTF-8文字列->バイト)は潜在的に損失を被ります。

于 2012-11-16T07:30:08.260 に答える
0

私は次の解決策を提案します:

NSString * line_utf16 [ENOUGH_MEMORY_SIZE];

line_utf16 = [NSString stringWithFormat:@ "%s"、line_utf8];

ENOUGH_MEMORY_SIZEは、line_utf8に使用されるメモリを少なくとも2倍超えています

line_utf16のメモリは、 line_utf8 のサイズの少なくとも2倍を動的または静的に割り当てる必要があると 思います。

同様の問題が発生した場合は、いくつかの文を追加してください。

于 2018-10-11T14:49:34.543 に答える