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;
}

据我所知,它正在通过流并将事物一一转换为字符以获取字符串。问题在于它不适用于 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());
}

您不能一次转换一个字符,因为有些字符可以用一个以上的字节表示,因此我使用List<byte>来收集整个流。

我认为这里最大的警告是您需要确保客户端正在向您发送 UTF8 格式的文本。

编辑:

除了对此答案的评论之外,来自Can UTF-8 contains zero byte?

是的,UTF8 中的零字节是代码点 0,NUL。没有其他 Unicode 代码点将以 UTF8 编码,其中任何地方都带有零字节。

因此可以安全地假设如果您收到一个零字节,它是 NUL 并且实际上不是代码点的一部分。

于 2012-11-15T01:08:36.800 回答