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

C#控制台项目中 显示为?的问题求助

解决C#中爬取文本里非断行空格显示为?的问题

我懂你遇到的这个头疼问题——爬取的文本里原本的 存完输出就变成问号,试了编码转换和各种替换都没效果对吧?其实核心是你找错了要处理的对象,咱们一步步搞定:

问题本质拆解

当你用h.TextContent获取网页文本时,HTML里的 已经被解析成了Unicode非断行空格字符(U+00A0),而不是你以为的字符串 或者 。输出显示成?,要么是控制台编码不支持这个特殊空格,要么是你替换时瞄准错了目标字符。

你之前写的Replace('&', ' ')这类代码完全不对,因为&是HTML里&的转义,而TextContent已经把所有HTML实体解析成了对应的Unicode字符,根本不会存在&这样的字符串。

正确解决步骤

1. 先确认目标字符

你可以先打印出那个问号对应的Unicode码,验证是不是U+00A0:

foreach (char c in head)
{
    Console.WriteLine($"字符: {c} | Unicode码: {(int)c:X4}");
}

如果输出里有Unicode码: 00A0,那就是它没错了。

2. 替换非断行空格

直接针对U+00A0字符进行替换,换成普通空格或者直接移除:

// 替换为普通空格
head = head.Replace('\u00A0', ' ');

// 或者直接移除
// head = head.Replace('\u00A0', string.Empty);

3. 修复控制台显示问题

如果替换后还是显示问号,那是控制台的编码不支持Unicode字符,你需要在程序开头设置控制台的输出编码:

// 设置控制台输出为UTF-8,支持绝大多数Unicode字符
Console.OutputEncoding = Encoding.UTF8;

完整示例代码

using System;
using System.Text;

class Program
{
    static void Main()
    {
        // 先配置控制台编码
        Console.OutputEncoding = Encoding.UTF8;

        // 模拟爬取到的文本(包含U+00A0)
        string head = "这是一段包含\u00A0非断行空格的文本";

        // 替换非断行空格为普通空格
        head = head.Replace('\u00A0', ' ');

        // 输出测试
        Console.WriteLine("处理后文本: " + head);
    }
}

额外注意事项

如果是存储到文件或数据库时出现问号,要确保存储时使用的是支持Unicode的编码(比如UTF-8),别用ASCII这类窄编码——ASCII无法表示U+00A0这类扩展字符,会直接把它替换成?。

内容的提问来源于stack exchange,提问作者arcanium0611

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 11:47:37