>我有数据库(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);