代码之家  ›  专栏  ›  技术社区  ›  Bjarki Heiðar user3532037

从查询字符串解码大写字母

  •  1
  • Bjarki Heiðar user3532037  · 技术社区  · 7 年前

    查询字符串包含 foo=Þórþ Örnö Ægirssonð

    当我把它解码为 UTF8 它适用于 ð, ö, æ 但不适用于大写版本 Ð, Ö, Þ

                byte[] bytes = Encoding.Default.GetBytes(Request.QueryString["foo"]);
                var value = Encoding.UTF8.GetString(bytes);
    

    下面是此字符串在解码之前的外观 Ãórþ Ãrnö Ãgirssonð

    下面是解码为UTF8后的效果 �?órþ �?rnö �?girssonð

    我错过什么了吗?我已经尝试过以UTF7和我在 Encoding Class 在MSDN上。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Tommaso Belluzzo    7 年前

    问题是您(可能)正在使用两种不同的编码: Default 用于生成字节数组和 UTF8 用于重建字符串。很可能在你的电脑上 违约 不同于 UTF8 ,这把事情搞砸了。

    使用时必须小心 Encoding.Default . 下面是它的工作原理(直接引用自 MSDN ):

    不同的计算机可以使用不同的编码作为默认编码,并且 默认编码甚至可以在一台计算机上更改。因此 数据从一台计算机传输到另一台计算机,甚至在 同一台计算机上的不同时间可能翻译错误。 此外,默认属性返回的编码使用 将不支持的字符映射到字符的最佳回退 代码页支持。出于这两个原因,使用默认值 通常不建议使用编码。确保编码的字节 如果正确解码,则应使用Unicode编码,例如 UTF8Encoding或UnicodeEncoding,带有前导码。另一种选择是 使用更高级别的协议以确保使用相同的格式 编码和解码。

    这个 UTF8 在这种情况下,编码应该是您想要的,但您必须连贯地应用它:

    Byte[] bytes = Encoding.UTF8.GetBytes(Request.QueryString["foo"]);
    String value = Encoding.UTF8.GetString(bytes);
    

    看看 this demo ,对我来说很好。