C#读取含en dash短破折号的文本文件时字符显示为?的问题
C#读取短破折号显示为问号的解决办法
1. 找准文件的实际编码
你试过多种编码无效,核心问题大概率是没匹配到文件真实的编码格式。用Notepad++就能快速确认:
- 打开你的
sample.txt,点击顶部「编码」菜单,查看当前选中的选项(常见的如Windows-1252、ISO-8859-1) - 确定编码后,用对应
Encoding读取文件,比如Windows-1252的编码ID是1252,代码示例:
var targetEncoding = Encoding.GetEncoding(1252); var content = File.ReadAllText(@"C:\fullfilepath\sample.txt", targetEncoding);
2. 修复控制台显示问题
就算文件读取正确,Windows控制台默认编码(一般是GBK或OEM编码)不支持显示U+2013短破折号,照样会输出问号。只需给控制台设置UTF-8输出编码:
在Console.WriteLine前添加一行:
Console.OutputEncoding = Encoding.UTF8;
完整可用代码
static void Main(string[] args) { // 替换为你文件的真实编码,比如Windows-1252 var fileEncoding = Encoding.GetEncoding(1252); var content = File.ReadAllText(@"C:\fullfilepath\sample.txt", fileEncoding); // 让控制台支持UTF-8字符显示 Console.OutputEncoding = Encoding.UTF8; Console.WriteLine(content); Console.ReadKey(); }
3. 不确定编码?用二进制验证
如果拿不准文件编码,直接读取字节查看短破折号对应的数值:
var bytes = File.ReadAllBytes(@"C:\fullfilepath\sample.txt"); // 找到短破折号位置的字节,对比编码表: // Windows-1252中短破折号对应0x96;UTF-8中对应0xE2 0x80 0x93
比如读到0x96就用1252编码,读到0xE2 0x80 0x93就是UTF-8(那之前没效果就是控制台编码的问题)。
内容的提问来源于stack exchange,提问作者Uğur Can
相关产品推荐
相关产品推荐

