我创建了TCP服务器,该服务器正在分发客户端的消息并在问题上运行。当我通过流发送西里尔字母消息时,它们无法正确解码。谁知道我该如何修复?
以下是发送消息的代码:
var message = Console.ReadLine().ToCharArray().Select(x => (byte)x).ToArray();
stream.Write(message);`
以下是接收代码:
var numberOfBytes = stream.Read(buffer,0,1024);
Console.WriteLine($"{numberOfBytes} bytes received");
var chars = buffer.Select(x=>(char)x).ToArray();
var message = new string(chars);
答案 0 :(得分:2)
问题在于C#中的字符代表2字节的UTF-16字符。西里尔字母大于UTF-16中的255,因此将其转换为字节时会丢失信息。
要将字符串转换为字节数组,请使用Encoding类:
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(Console.ReadLine());
要将其转换回接收者端的字符串,请输入:
string message = System.Text.Encoding.UTF8.GetString(buffer);
另一个问题是Stream.Read不能保证一次读取消息的所有字节(您的流不知道您发送的是一定大小的数据包)。这样就可能发生,例如,接收到的字节数组的最后一个字节只是2字节字符的第一个字节,而下次调用Stream.Read时又收到另一个字节。
对此问题有几种解决方案:
答案 1 :(得分:0)
要将字符串转换为字节,请使用System.Text.Encoding.GetBytes(string)
。我建议您将发送代码更改为:
// using System.Text;
var messageAsBytes = Encoding.UTF8.GetBytes(Console.ReadLine());
要将字节转换为字符串,请使用System.Text.Encoding.GetString(byte[])
。如果您收到UTF-8编码的字节:
// using System.Text;
var messageAsString = Encoding.UTF8.GetString(buffer);
一些建议阅读: