【问题标题】:Convert Latin 1 encoded UTF8 to Unicode将拉丁 1 编码的 UTF8 转换为 Unicode
【发布时间】:2010-11-28 16:00:24
【问题描述】:

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

【问题讨论】:

  • 嘿。也许如果您向我们展示您用于从数据库中检索字符串的代码的摘录,这可能会有所帮助。还有它是什么样的数据库? MS SQL?
  • 这个问题语无伦次。 “latin 1 编码的 UTF 8”到底是什么?

标签: c# .net encoding


【解决方案1】:
Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(s))

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

请注意,您的“Latin-1”错误编码字符串实际上可能是“Windows codepage 1252”错误编码字符串;我无法从给定的示例中分辨出来,因为它没有使用两种编码之间不同的任何字符。如果是这种情况,请改用GetEncoding(1252)

这也是假设数据库的内容有问题。如果数据库应该存储 UTF-8 字符串,但您将它们拉出来,就好像它们是 Latin-1(或代码页 1252,因为那是系统代码页),那么您真的需要重新配置您的数据访问层以设置正确的编码。如果您使用的是 SQL Server,最好开始使用 NVARCHAR。

【讨论】:

  • getBytes(s)) 应该是 GetBytes(s))
  • 先生,您是“最好开始使用 NVARCHAR”的纯金,为我节省了大量时间来搜索如何编码/解码字符串或更改数据库排序规则。长命百岁!!!
【解决方案2】:

我使用的是sql server,所有列都是nvarchar。数据是使用 mysql dump 从 latin1 而非 utf8 的 db 导入的。所以所有的 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)));

【讨论】:

  • 我不确定第二行的意义是什么。编码为 UTF-8,转码为 cp1251(为什么不首先使用 1251 编码上的 GetBytes?)然后从这些字节中获取 Unicode 字符串?所有这一切都会从您的 Unicode 字符串中过滤掉 1251 中不存在的任何字符。 int 版本:msdn.microsoft.com/en-us/library/wzsz3bk3.aspx
猜你喜欢
  • 2011-02-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2017-02-24
相关资源
最近更新 更多