将Latin 1编码的UTF8转换为Unicode

4

我试图将一个以UTF8编码的数据库转换为Windows 1251编码(不要问我为什么,但我需要这样做)。数据库中所有俄语编码的字符都显示为абвгдÐ。当我将它们从数据库中提取到我的C#应用程序中的字符串中时,我仍然看到абвгдÐ。无论我尝试将此字符串解释为UTF8编码的字符串,它似乎都被解释为Latin1单字节字符串,并且我没有看到我的文本以俄语显示。我基本上需要将这个看起来像Latin1编码的UTF8编码字符串转换为Unicode,以便我可以将其稍后转换为1251,但我一直没有成功地做到这一点。有人有什么想法吗?


嘿。也许如果您向我们展示一下从数据库检索字符串所使用的代码片段,这可能会有所帮助。另外,这是什么类型的数据库?MS SQL? - CraftyFella
这个问题不太清晰。什么是“Latin 1编码的UTF-8”? - Mark Amery
2个回答

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

现在你有一个包含西里尔字母的普通 Unicode 字符串。

请注意,你的“Latin-1”错误编码的字符串可能实际上是一个“Windows Codepage 1252”错误编码的字符串;根据给定的示例,我无法确定两种编码之间不同的字符。如果是这种情况,请使用GetEncoding(1252)代替。

此外,这假设数据库内容有误。如果数据库“应该”存储 UTF-8 字符串,但你却像使用 Latin-1 (或 codepage 1252,因为它是系统代码页)一样提取它们,那么你需要重新配置数据访问层以设置正确的编码。如果你正在使用 SQL Server,则最好开始使用 NVARCHAR。


应该将getBytes(s)改为GetBytes(s))。 - o3o
您好,使用“最好开始使用NVARCHAR”这个建议,您真是太棒了!这让我省去了大量搜索如何编码/解码字符串或更改数据库排序规则的时间。祝您长命百岁,繁荣昌盛! - Zahari Kitanov

1

我正在使用SQL Server,并且所有列都是nvarchar类型。数据是通过mysql dump从一个使用latin1而不是utf8的数据库导入的。因此,所有Unicode字符串实际上都是latin1编码的。无论如何,我已经找到了解决方法,它与您建议的非常相似。以下是我将latin1编码的UTF-8转换为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)));

2
我不确定第二行的意义。对UTF-8进行编码,然后转换为cp1251(为什么不直接在第一次使用GetBytes处理1251编码呢?),最后再从这些字节中获取一个Unicode字符串?所有这样做的作用只是过滤掉您的Unicode字符串中不存在于1251中的任何字符。int版本:http://msdn.microsoft.com/en-us/library/wzsz3bk3.aspx - bobince

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接