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
相关产品推荐
相关产品推荐

