MacOS下C#项目Console.ReadLine()显示问号菱形异常符号问题
问题:C# UDP客户端Console输入出现菱形问号符号
我正在学习C#,开发一个模拟聊天应用,需求是实现客户端向服务器发送消息、服务器返回消息的功能。但客户端使用Console.ReadLine()输入内容时,会显示带问号的菱形奇怪符号,该问题未在服务器端出现。
客户端代码如下:
namespace client { internal class Program { static void Main(string[] args) { Console.InputEncoding = Encoding.Unicode; Console.OutputEncoding = Encoding.Unicode; Console.WriteLine("Server IP address: "); string _ipTemp = Console.ReadLine()!; var _ip = IPAddress.Parse(_ipTemp); var _client = new UdpClient(); _client.Connect(_ip, 1308); while (true) { Console.Write("#Client >>>"); var _text = Console.ReadLine()!; var _buffer = Encoding.Unicode.GetBytes(_text); _client.Send(_buffer, _buffer.Length); var _ipendpoint = new IPEndPoint(0, 0); _buffer = _client.Receive(ref _ipendpoint); var _response = Encoding.Unicode.GetString(_buffer); Console.WriteLine("#Server >>> {0}", _response); } } }
解决方案
问题原因
你强制将控制台输入编码设置为Encoding.Unicode(UTF-16),但Windows系统的控制台默认输入编码是GBK(代码页936),编码不匹配导致输入的字符无法被正确解析,最终显示为带问号的菱形占位符。
修复步骤
- 移除错误的输入编码设置:删掉
Console.InputEncoding = Encoding.Unicode这一行,让控制台使用系统默认的输入编码; - 统一网络传输编码:网络通信建议使用UTF-8编码(兼容性更好,避免UTF-16的字节序问题),将代码中所有
Encoding.Unicode替换为Encoding.UTF8; - 保持输出编码正常:保留
Console.OutputEncoding = Encoding.UTF8(或Unicode),确保输出的字符能正确显示。
修改后的代码
namespace client { internal class Program { static void Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; Console.WriteLine("Server IP address: "); string _ipTemp = Console.ReadLine()!; var _ip = IPAddress.Parse(_ipTemp); var _client = new UdpClient(); _client.Connect(_ip, 1308); while (true) { Console.Write("#Client >>>"); var _text = Console.ReadLine()!; var _buffer = Encoding.UTF8.GetBytes(_text); _client.Send(_buffer, _buffer.Length); var _ipendpoint = new IPEndPoint(0, 0); _buffer = _client.Receive(ref _ipendpoint); var _response = Encoding.UTF8.GetString(_buffer); Console.WriteLine("#Server >>> {0}", _response); } } }
补充说明
如果服务器端之前使用Encoding.Unicode处理消息,需要同步修改为Encoding.UTF8,确保两端编码一致,否则会出现新的乱码问题。
内容的提问来源于stack exchange,提问作者Bình Mai Thanh
相关产品推荐
相关产品推荐

