将字符串从 CP866 转换为 UTF8
Converting string from CP866 to UTF8
我有数据库 (MSSQL),它有一个 table 带有产品名称的翻译。其中一种语言是俄语。
使用通用西里尔文解码器的数据库条目 ¸ą¤®åą Øā«ģ 示例 我设法发现它是 Прдохранитль 以及源编码是 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
你的问题是你在做相反的事情。 line
不显示西里尔字母。您正在查看的字符是 Windows-1257
个字符。当您将字符串保存为编码时,您将 符号 与该编码匹配,而不是 解释 它们作为该编码,这意味着这只会损坏更进一步。
还要意识到 .Net 中的文本没有编码(或者,无论如何,您都不需要 关心 编码)。 String
只是一个 String
,一系列 unicode 字符。编码仅在您需要它作为字节时才变得相关。
因为我们知道这些字符在 Windows-1257
编码时将包含在 CP866
中查看它们所需的正确字节值,但目前它们是纯 unicode String
和不是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);
撇开关于这样的字符串如何首先出现在数据库中的问题,您可以像这样转换它:
string line = "¸ą¤®åą Øā«ģ";
Encoding w1257 = Encoding.GetEncoding("windows-1257");
Encoding cp866 = Encoding.GetEncoding("CP866");
var lineFinal = cp866.GetString(w1257.GetBytes(line));
因为您的原始字符串似乎使用 1257 代码页,而您需要 CP866。
请注意,这个特定的字符串仍然是一个很大的损坏,它导致 Предохр нитель
并且正确的词是 Предохранитель
(所以我们有 space 而不是 а
索引 8)。然而,原始字符串在这个位置也包含 space,所以这个损坏不是解码的结果(可能你只是将它错误地复制到问题中)。
我有数据库 (MSSQL),它有一个 table 带有产品名称的翻译。其中一种语言是俄语。
使用通用西里尔文解码器的数据库条目 ¸ą¤®åą Øā«ģ 示例 我设法发现它是 Прдохранитль 以及源编码是 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
你的问题是你在做相反的事情。 line
不显示西里尔字母。您正在查看的字符是 Windows-1257
个字符。当您将字符串保存为编码时,您将 符号 与该编码匹配,而不是 解释 它们作为该编码,这意味着这只会损坏更进一步。
还要意识到 .Net 中的文本没有编码(或者,无论如何,您都不需要 关心 编码)。 String
只是一个 String
,一系列 unicode 字符。编码仅在您需要它作为字节时才变得相关。
因为我们知道这些字符在 Windows-1257
编码时将包含在 CP866
中查看它们所需的正确字节值,但目前它们是纯 unicode String
和不是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);
撇开关于这样的字符串如何首先出现在数据库中的问题,您可以像这样转换它:
string line = "¸ą¤®åą Øā«ģ";
Encoding w1257 = Encoding.GetEncoding("windows-1257");
Encoding cp866 = Encoding.GetEncoding("CP866");
var lineFinal = cp866.GetString(w1257.GetBytes(line));
因为您的原始字符串似乎使用 1257 代码页,而您需要 CP866。
请注意,这个特定的字符串仍然是一个很大的损坏,它导致 Предохр нитель
并且正确的词是 Предохранитель
(所以我们有 space 而不是 а
索引 8)。然而,原始字符串在这个位置也包含 space,所以这个损坏不是解码的结果(可能你只是将它错误地复制到问题中)。