代码之家  ›  专栏  ›  技术社区  ›  Alex

将拉丁1编码的UTF8转换为Unicode

  •  4
  • Alex  · 技术社区  · 16 年前

    2 回复  |  直到 16 年前
        1
  •  14
  •   bobince    13 年前
    Encoding.UTF8.GetString(Encoding.GetEncoding("iso-8859-1").GetBytes(s))
    

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

    请注意,您的Latin-1 misencoded字符串可能实际上是Windows代码页1252 misencoded字符串;我无法从给定的示例中判断,因为它没有使用两种编码之间任何不同的字符。如果是这种情况,请使用 GetEncoding(1252)

    此外,这还假设是数据库的内容出错。如果数据库是 想象上的 要存储UTF-8字符串,但要将它们像拉丁语-1(或代码页1252,因为它是系统代码页)一样拉出,那么实际上需要重新配置数据访问层以设置正确的编码。如果您使用的是SQL Server,最好开始使用NVARCHAR。

        2
  •  1
  •   alex alex    16 年前

    我使用的是sql server,所有列都是nvarchar。数据是通过mysql转储从latin1而不是utf8的数据库导入的。所以所有的unicode字符串都是简单的拉丁1编码。不管怎样,我想出来了,它和你的建议非常相似。下面是我将拉丁文编码的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)));