将字符串从 CP866 转换为 UTF8



>我有数据库(MSSQL(,它有一个包含产品名称翻译的表格。其中一种语言是俄语。

使用通用西里尔解码器的数据库条目 ̧ą¤®åą Øā«ģ 的示例我设法发现它是 Прдохранитль 以及源编码是 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

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

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

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

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

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

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

由于我们知道这些字符在Windows-1257编码中将包含以CP866方式查看它们所需的正确字节值,但此时它们是纯 unicodeString而不是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);

相关内容

  • 没有找到相关文章

最新更新