从C#中的原始TCP流获取unicode字符串

时间:2012-11-15 00:14:50

标签: c# mysql utf-8

所以我试图修改一些用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值的字符串?

2 个答案:

答案 0 :(得分: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 contain zero byte?

对此答案的评论
  

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

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

答案 1 :(得分: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));
}