将Latin 1编码的UTF8转换为Unicode

时间:2009-09-16 01:49:25

标签: c# .net encoding

我试图将以UTF8编码的数据库从它看起来转换成Windows 1251编码(不要问,但我需要这样做)。数据库中所有俄语编码字符都显示为абвгÐ'Ð。当我将它们从数据库中拉出到我的C#应用​​程序中,进入字符串时,我仍然看到абвгÐ'Ð。无论我尝试将此字符串解释为UTF8编码的字符串,它似乎被解释为latin1单字节字符串,并且我没有看到我的文本显示为俄语。我基本上需要做的是将这个latin1 looking-utf8编码的字符串转换为Unicode,以便我可以将其转换为1251,但我无法成功完成此操作。有人有任何想法吗?

2 个答案:

答案 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)));