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

时间:2018-01-30 21:09:54

标签: c# urlencode

QueryString包含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以及我在MSDN上Encoding Class找到的适用于冰岛语的任何集合。

1 个答案:

答案 0 :(得分:2)

问题是你(可能)使用两种不同的编码:Default用于生成字节数组,UTF8用于重建字符串。您的PC Default可能与UTF8不同,这可能会让您感到不安。

使用Encoding.Default时一定要小心。以下是它的工作原理(直接引自MSDN):

  

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

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

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

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