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

C#用StreamWriter按ISO-8859-1编码写入带重音字符串出现乱码如何解决

问题原因

你得到的错误输出:

Gibt es ein Restaurant in der N?he
是典型的编码不匹配触发字符替换回退的表现,问题由两个原因导致:

  • 编码提供程序未注册:.NET Core、.NET 5+ 版本默认没有内置ISO-8859-1这类非Unicode编码的实现,未提前注册编码提供程序的前提下调用Encoding.GetEncoding("ISO-8859-1"),会触发默认的字符替换回退逻辑,将不在默认支持范围内的字符替换为?,这是问题的核心诱因。
  • 存在冗余的手动编码转换逻辑:C#的string本身以UTF-16/Unicode格式存储,不需要你手动完成「字符串转Unicode字节→转ISO字节→转char数组」的流程,多余的转换步骤反而会提升字符损坏的概率,同时你原有代码未释放StreamWriter,也可能存在缓冲区未刷入文件的异常风险。

修复方案

  1. 若你使用的是.NET Core、.NET 5及更高版本,先安装System.Text.Encoding.CodePages NuGet包;.NET Framework用户可直接跳过该步骤,框架已内置相关编码支持。
  2. 在程序入口位置(例如Main方法最开头)注册编码提供程序:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  1. 简化写入文件的代码,直接通过指定了ISO-8859-1编码的StreamWriter写入原始字符串即可,无需手动做编码转换:
string s = "Gibt es ein Restaurant in der Nähe";
Encoding iso = Encoding.GetEncoding("ISO-8859-1");
// using语句会自动释放StreamWriter并刷新缓冲区
using (StreamWriter sw = new StreamWriter(outputPath, iso))
{
    sw.WriteLine(s);
}

ISO-8859-1编码完全覆盖ä这类西欧重音字符,按以上方案修改后即可正常输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:06:05