2

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

4

2 回答 2

1

撇开有关此类字符串如何最终进入数据库的问题不谈,您可以像这样转换它:

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

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

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

于 2018-05-14T09:01:40.080 回答
0

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

还要意识到 .Net 中的文本没有编码(或者,无论如何都没有您需要关心的编码)。AString只是一个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);
于 2018-05-14T09:01:28.623 回答