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