将字符串从CP866转换为UTF8

时间:2018-05-14 08:43:14

标签: c# encoding utf-8 cp866

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

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

2 个答案:

答案 0 :(得分:1)

不考虑这些字符串如何最终在数据库中出现的问题,您可以将其转换为:

response.json({user : user[0] , token : token , anyVariable : AnyData ... })

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

请注意,此特定字符串仍然存在较大损坏,导致string line = "¸ą¤®åą ­Øā«ģ"; Encoding w1257 = Encoding.GetEncoding("windows-1257"); Encoding cp866 = Encoding.GetEncoding("CP866"); var lineFinal = cp866.GetString(w1257.GetBytes(line)); 且正确的字词为Предохр нитель(因此我们在索引8处有空格而不是Предохранитель)。但是,原始字符串在此位置还包含空格,因此这种损坏不是解码的结果(可能您只是将其错误地复制到问题中)。

答案 1 :(得分:0)

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

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

由于我们知道这些字符在Windows-1257编码时将包含在CP866中查看它们所需的正确字节值,但此时它们是纯unicode {{1}并且 String,您需要先转换为Windows-1257个字节,然后解释这些字节为是windows-1257

CP866