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

C#写入含特殊字符文本文件乱码,目标程序报错求助

问题分析与解决方案

问题根源

你遇到的乱码问题核心在于错误地使用了ASCII编码写入包含非ASCII字符的字符串。ASCII编码仅支持0-127范围内的字符,任何超出这个范围的字符都会被替换成ASCII的替代标记(通常是乱码字节),这就导致后续不同编辑器、程序用不同编码解析时,出现各种异常的显示结果。

具体原因拆解

  • 当你用Encoding.ASCII写入字符串时,原字符串中的特殊字符(来自PostgreSQL的非ASCII字符)被转换成了不符合预期的字节序列。
  • Notepad++以UTF-8打开时,会把这些乱码字节尝试按UTF-8规则解析,所以显示成5掳 ENNIO;以ANSI打开时,用系统默认编码(比如GBK/GB2312)解析,就变成了5脗掳 ENNIO。
  • 目标程序读取时用了另一种编码逻辑解析这些乱码字节,最终拆分出错误的字符5脗 掳 ENNIO并触发报错。

解决方案

1. 改用正确的编码写入文件

放弃使用Encoding.ASCII,根据目标程序的编码要求选择合适的编码,最推荐的是UTF-8(通用兼容性好):

// 使用UTF-8编码写入,若目标程序需要带BOM的UTF-8,直接用Encoding.UTF8即可;不需要的话用new UTF8Encoding(false)
StreamWriter swClifor = new StreamWriter("test.txt", true, Encoding.UTF8);
string cString = "5掳 ENNIO"; // 确保从PostgreSQL读取时已正确解码为.NET字符串
swClifor.WriteLine(cString);
swClifor.Close();

如果目标程序明确要求使用ANSI编码(比如系统默认的GBK),可以这样写:

// 注意:需确保目标程序的编码与系统默认ANSI一致,或指定具体编码名
StreamWriter swClifor = new StreamWriter("test.txt", true, Encoding.GetEncoding("GBK"));

2. 确保从PostgreSQL读取时无乱码

在从PostgreSQL读取字符串时,要保证数据库连接配置正确:

  • 确认PostgreSQL数据库中该字段的编码是UTF-8(大多数场景下的默认配置)。
  • 在数据库连接字符串中指定编码参数(以Npgsql驱动为例,添加Encoding=UTF8),确保读取时正确将数据库字节解码为.NET的UTF-16字符串。

3. 验证目标程序的编码要求

如果上述调整后仍有问题,需要确认目标程序读取文件时使用的编码格式,确保写入和读取的编码完全一致——编码不匹配是乱码问题的最常见原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:01:16