转换拉丁语1编码UTF8为Unicode(Convert Latin 1 encoded UTF8

2019-07-18 04:23发布

我来到尝试转换是在utf-8编码从什么样子,到Windows 1251的编码数据库(不要问,但我需要做到这一点)。 所有在db俄罗斯,编码的字符的显示为d°d±Ð²Ð³Ð'Ð。 当我拉出来的分贝到我的C#应用​​程序,为字符串,我仍然看到d°d±Ð²Ð³Ð'Ð。 不管是什么我尝试做解释该字符串作为UTF8编码字符串,它似乎被解释为latin1的单字节字符串,我没有看到我的文字显示为俄语。 我基本上需要做的是寻找LATIN1,UTF8编码字符串转换成Unicode,这样我以后可以将其转换为1251,但我一直没能成功地做到这一点。 任何人有什么想法?

Answer 1:

Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(s))

现在你有一个包含西里尔正常的Unicode字符串。

请注意,这可能是你的拉丁-1'misencoded串实际上可能是一个“的Windows代码页1252” misencoded串; 我无法从给定的例子告诉,因为它不使用任何属于两种编码之间不同的字符。 如果是这样的话使用GetEncoding(1252)来代替。

另外这是假设它的数据库中的内容有过错。 如果数据库应该存储UTF-8字符串,但你拉出来,如果他们的Latin-1(或代码页1252,由于是作为系统代码页),那么你真的需要重新配置你的数据访问层设置正确的编码。 如果您使用的SQL Server,更好地开始使用NVARCHAR。



Answer 2:

我使用SQL Server和所有列都为nvarchar。 该数据与MySQL转储进口从已处理latin1分贝,而不是UTF8。 因此,所有的Unicode字符串只是LATIN1编码。 在任何情况下,我想通了,与其非常相似,你的建议。 这里就是我所做的,以编码UTF8和latin1转换成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)));


文章来源: Convert Latin 1 encoded UTF8 to Unicode
标签: c# .net encoding