将字符串从 CP866 转换为 UTF8

Converting string from CP866 to UTF8

我有数据库 (MSSQL),它有一个 table 带有产品名称的翻译。其中一种语言是俄语。

使用通用西里尔文解码器的数据库条目 ¸ą¤®åą Øā«ģ 示例 我设法发现它是 Прдохранитль 以及源编码是 CP866,我需要它来获得 WIndows-1257 或 utf-8.

如何在 C# 中执行此操作?

我试过

string line = "¸ą¤®åą ­Øā«ģ";

Encoding cp866 = Encoding.GetEncoding("CP866");
Encoding w1257 = Encoding.GetEncoding("windows-1257");
byte[] cp866Bytes = cp866.GetBytes(line);
byte[] w1257Bytes = Encoding.Convert(cp866, w1257, cp866Bytes);
var lineFinal = w1257.GetString(w1257Bytes);

谁能帮帮我?

给定代码的结果是 ?a?¤Raa -Oa?<g

你的问题是你在做相反的事情。 line 不显示西里尔字母。您正在查看的字符是 Windows-1257 个字符。当您将字符串保存为编码时,您将 符号 与该编码匹配,而不是 解释 它们作为该编码,这意味着这只会损坏更进一步。

还要意识到 .Net 中的文本没有编码(或者,无论如何,您都不需要 关心 编码)。 String 只是一个 String,一系列 unicode 字符。编码仅在您需要它作为字节时才变得相关。

因为我们知道这些字符在 Windows-1257 编码时将包含在 CP866 中查看它们所需的正确字节值,但目前它们是纯 unicode String不是Windows-1257,你需要先转换windows-1257字节,然后解释那些字节为CP866

String line = "¸ą¤®åą ­Øā«ģ";
Encoding cp866 = Encoding.GetEncoding("CP866");
Encoding w1257 = Encoding.GetEncoding("windows-1257");
Byte[] w1257Bytes = w1257.GetBytes(line);
String lineFinal = cp866.GetString(w1257Bytes);

撇开关于这样的字符串如何首先出现在数据库中的问题,您可以像这样转换它:

string line = "¸ą¤®åą ­Øā«ģ";
Encoding w1257 = Encoding.GetEncoding("windows-1257");
Encoding cp866 = Encoding.GetEncoding("CP866");            
var lineFinal = cp866.GetString(w1257.GetBytes(line));

因为您的原始字符串似乎使用 1257 代码页,而您需要 CP866。

请注意,这个特定的字符串仍然是一个很大的损坏,它导致 Предохр нитель 并且正确的词是 Предохранитель(所以我们有 space 而不是 а索引 8)。然而,原始字符串在这个位置也包含 space,所以这个损坏不是解码的结果(可能你只是将它错误地复制到问题中)。