如何在C#中将CP866编码转换为UTF-8或Windows-1257?
解决CP866乱码转UTF-8/Windows-1257的问题
你的问题出在错误的处理顺序上——现在变量line里的乱码字符串,本质是原始CP866编码的字节被用错误的编码(大概率是UTF-8)解码后得到的结果。直接用cp866.GetBytes(line)得到的不是原始的CP866字节,而是把乱码转成CP866的字节,这自然会导致转换失败。
正确的处理步骤
- 先把乱码字符串还原成原始的CP866字节:因为乱码是UTF-8错误解码CP866字节产生的,所以我们需要把乱码转成UTF-8字节,这就是原始的CP866数据。
- 用CP866编码解码这些字节,得到正确的俄文文本。
- 如果需要转换成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
相关产品推荐
相关产品推荐

