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