我试图将以UTF8编码的数据库从它看起来转换成Windows 1251编码(不要问,但我需要这样做)。数据库中所有俄语编码字符都显示为абвгÐ'Ð。当我将它们从数据库中拉出到我的C#应用程序中,进入字符串时,我仍然看到абвгÐ'Ð。无论我尝试将此字符串解释为UTF8编码的字符串,它似乎被解释为latin1单字节字符串,并且我没有看到我的文本显示为俄语。我基本上需要做的是将这个latin1 looking-utf8编码的字符串转换为Unicode,以便我可以将其转换为1251,但我无法成功完成此操作。有人有任何想法吗?
答案 0 :(得分:12)
Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(s))
现在您有一个包含Cyrillic的普通Unicode字符串。
请注意,您的'Latin-1'错误编码的字符串可能实际上是'Windows codepage 1252'错误编码的字符串;我无法从给定的例子中看出,因为它不使用两种编码之间不同的任何字符。如果是这种情况,请改用GetEncoding(1252)
。
这也是假设它是数据库中的错误内容。如果数据库假设要存储UTF-8字符串,但是你将它们拉出来就好像它们是Latin-1(或代码页1252,因为那是系统代码页),那么你真的需要重新配置数据访问层以设置正确的编码。如果您使用的是SQL Server,最好开始使用NVARCHAR。
答案 1 :(得分:1)
我使用的是sql server,所有列都是nvarchar。数据是使用mysql dump从一个数据库导入的,该数据库是latin1,而不是utf8。所以所有unicode字符串都只是latin1编码。无论如何,我想出来了,它与你的建议非常相似。这就是我将latin1编码的utf8转换为1251所做的工作。
//re interpret latin1 in proper utf8 encoding
str = Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(str));
//convert from utf8 to 1251
str = Encoding.GetEncoding(1251).GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(1251), Encoding.UTF8.GetBytes(str)));