7

UTF-8エンコーディングでストリームからいくつかのデータを読み取りました

String line = new String(byteArray, "UTF-8");

次に、いくつかのサブシーケンスを見つけようとします

int startPos = line.indexOf(tag) + tag.length();
int endPos   = line.indexOf("/", startPos);

そしてそれを切る

String name = line.substring(startPos, endPos);

ほとんどの場合、問題なく動作しますが、結果が壊れることもあります。たとえば、"гордунни"I got values like "горд��нни"、などの入力名の場合"горду��ни""г��рдунни"何らかの理由でサロゲート ペアがランダムに壊れているようです。1000回中4回取れました。

修正方法は?indexOf()+substring() の代わりに他の String メソッドを使用する必要がありますか、それとも結果に対して何らかのエンコーディング/デコーディング マジックを使用する必要がありますか?

4

2 に答える 2

0

あなたの例では、byteArray、行、およびタグの内容を表示できますか? 取得される長さ、開始位置、終了位置も表示できますか? つまり、文字列「гордунни」には「/」がありません。そして、なぜ endPos を計算するのですか? タグ内の文字列は何ですか? 部分文字列の 2 番目のパラメーターが長さではなく endpos であることは確かですか? すべてのコードポイントが 0xFFFF 未満であるため、「гордунни」はサロゲート ペアを必要としないのは事実ですが、utf-16 文字列のどこかに少なくとも 1 つのサロゲート ペアがあると、文字列の長さから単語数が得られるはずです。コードポイントの数ではありません。Javaについてはよくわかりませんが、C#の長さは要素の数を示します。文字/コードポイントの数を取得するには、C# で StringInfo クラスを使用する必要があります。あなたもチェックしてください 文字列に BOM が含まれます。とは


String line = new String(byteArray, "UTF-8");

してる?バイト配列は、utf-16 に変換される utf-8 でエンコードされた文字列ですか? utf-8 BOM が含まれていますか? その後、文字列には utf-16LE または utf-16BE BOM がありますか?

于 2014-01-22T18:10:48.480 に答える