3

そのため、C#で記述されたソフトウェアに変更を加えようとしていますが、実際には開発者ではありません。コードはクライアントからデータを読み取り、そこから値を取得します。私が見ている問題は、英語以外の文字を使用するクライアントからの値があると、それがぎこちなくなることです。問題のコードは次のとおりです。

public static string ReadNT(BinaryReader stream)
{
  ret = "";
  byte addByte = 0x00;
  do {
    addByte = ReadByte(stream);
    if (addByte != 0x00)
      ret += (char)addByte;
  } while (addByte != 0x00);
  return ret;
}

私が知る限り、それはストリームを通過し、文字列を取得するために1つずつ文字に変換しています。それに関する問題は、unicode/utf8では機能しないことです。これをutf8値で動作する文字列に変換する方法はありますか?

4

2 に答える 2

0

StreamReader クラスを使用して、UTF8 文字列を読み取ることができます。

public static string ReadNT(BinaryReader stream)
{
   return (new StreamReader(stream, Encoding.UTF8, false)).ReadString();
}

それを制御できる場合は、文字列自体に加えて文字列のサイズを転送することを検討する必要があります。

public static string ReadNT(BinaryReader stream, int length)
{
    return Encoding.UTF8.GetString(stream.ReadBytes(length));
}
于 2012-11-15T01:40:54.690 に答える
0

これを試して:

public static string ReadNT(BinaryReader stream)
{
    List<byte> bytes = new List<byte>();
    byte addByte = 0x00;

    do
    {
        addByte = ReadByte(stream);

        if (addByte != 0x00)
        {
            bytes.Add((char)addByte);
        }
    } while (addByte != 0x00);

    return Encoding.UTF8.GetString(bytes.ToArray());
}

文字を一度に 1 つずつ変換することはできません。一部の文字は複数のバイトで表現される可能性があるため、List<byte>ストリーム全体を収集するために を使用しています。

ここでの大きな注意点は、クライアントが UTF8 形式のテキストを送信していることを確認する必要があるということです。

編集:

この回答へのコメントに加えて、Can UTF-8 contains zero byte?から。

はい、UTF8 のゼロ バイトはコード ポイント 0、NUL です。UTF8 でエンコードされる Unicode コード ポイントは他にありません。

したがって、0 バイトを受け取った場合、それは NUL であり、実際にはコード ポイントの一部ではないと想定しても安全です。

于 2012-11-15T01:08:36.800 に答える