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找到的适用于冰岛语的任何集合。
答案 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,它对我来说很好。