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

如何在C#中将CP866编码转换为UTF-8或Windows-1257?

解决CP866乱码转UTF-8/Windows-1257的问题

你的问题出在错误的处理顺序上——现在变量line里的乱码字符串,本质是原始CP866编码的字节被用错误的编码(大概率是UTF-8)解码后得到的结果。直接用cp866.GetBytes(line)得到的不是原始的CP866字节,而是把乱码转成CP866的字节,这自然会导致转换失败。

正确的处理步骤

  1. 先把乱码字符串还原成原始的CP866字节:因为乱码是UTF-8错误解码CP866字节产生的,所以我们需要把乱码转成UTF-8字节,这就是原始的CP866数据。
  2. 用CP866编码解码这些字节,得到正确的俄文文本。
  3. 如果需要转换成Windows-1257,再进行编码转换。

修正后的C#代码

// 你的乱码字符串
string garbledLine = "¸ą¤®åą ­Øā«ģ";

// 步骤1:把乱码转成UTF-8字节(这就是原始的CP866字节)
Encoding utf8 = Encoding.UTF8;
byte[] originalCp866Bytes = utf8.GetBytes(garbledLine);

// 步骤2:用CP866解码得到正确的俄文
Encoding cp866 = Encoding.GetEncoding("CP866");
string correctText = cp866.GetString(originalCp866Bytes);
// 此时correctText应该是"Прдохранитль"

// 步骤3(可选):转成Windows-1257编码的字符串
Encoding w1257 = Encoding.GetEncoding("windows-1257");
byte[] w1257Bytes = Encoding.Convert(cp866, w1257, originalCp866Bytes);
string w1257Text = w1257.GetString(w1257Bytes);

验证逻辑

你可以先输出correctText确认是否得到了预期的“Прдохранитль”,再进行后续的Windows-1257转换。核心就是要先还原出原始的CP866字节流,而不是直接对乱码字符串进行编码转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:32:05