You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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),编码不匹配导致输入的字符无法被正确解析,最终显示为带问号的菱形占位符。

修复步骤

  1. 移除错误的输入编码设置:删掉Console.InputEncoding = Encoding.Unicode这一行,让控制台使用系统默认的输入编码;
  2. 统一网络传输编码:网络通信建议使用UTF-8编码(兼容性更好,避免UTF-16的字节序问题),将代码中所有Encoding.Unicode替换为Encoding.UTF8;
  3. 保持输出编码正常:保留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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:27:11