【问题标题】:UrlEncoding issue for string with ß character带有 ß 字符的字符串的 UrlEncoding 问题
【发布时间】:2012-05-01 23:15:28
【问题描述】:

我有一个参数,我必须将其作为 url 的一部分传递。参数包含这个字符:ß

当我编码这个字符串时,我期待这个:%DF 但我得到的是:%c3%9f

这是我用来测试的一行 C#

  string test = HttpUtility.UrlEncode("ß");

【问题讨论】:

标签: c# encoding urlencode


【解决方案1】:

这是因为 UrlEncode 的默认实现是基于 UTF8 字符编码的。实际上,这完全在您的控制范围内。

例如下面的代码:

string sample = new string((char)0x0DF, 1);
string test = HttpUtility.UrlEncode(sample);
Console.WriteLine("UTF8 Ecoded: {0}", test);
test = HttpUtility.UrlEncode(sample, Encoding.GetEncoding(1252));
Console.WriteLine("1252 Ecoded: {0}", test);

输出以下内容:

UTF8 Ecoded: %c3%9f
1252 Ecoded: %df

当然,在 URI 上使用另一种编码的危险在于某些字符根本无法表示...

例如,这段代码:

string sample = new string((char) 312, 1);
Encoding encoding = Encoding.GetEncoding(1252);
string test = HttpUtility.UrlEncode(sample);
Console.WriteLine("UTF8 Ecoded: {0}, round-trip = {1}", test, sample == HttpUtility.UrlDecode(test));
test = HttpUtility.UrlEncode(sample, encoding);
Console.WriteLine("1252 Ecoded: {0}, round-trip = {1}", test, sample == HttpUtility.UrlDecode(test, encoding));
Console.ReadLine();

将输出以下内容:

UTF8 Ecoded: %c4%b8, round-trip = True
1252 Ecoded: %3f, round-trip = False

您可以在后面的示例中看到编码是“%3f”,它在未编码时等于问号“?”,而不是输入字符 312 (0x138)。

简而言之,将“ß”编码为“%c3%9f”并没有错,相反,它是正确的表示。但是,如果您必须拥有编码“%DF”才能让远程服务器正确解码,请使用所示的 1252 代码页。

【讨论】:

  • 谢谢你拯救我的一天。我遇到了同样的问题,实际上远程 Web 服务使用 WINDOWS-1252 编码作为入口。
【解决方案2】:

使用 UTF-8 编码时,ß 字符被编码为 %c3%9f。如果可能,这是您应该使用的。

如果您的目标网络服务器使用其他编码,您需要确切知道那是什么编码。由于您想将该字符编码为%df,因此可能是Windows-1252Windows-1250(或可能是其他字符)。

如果你确定这是你想要做的,你可以使用(假设是 Windows-1252):

HttpUtility.UrlEncode("ß", Encoding.GetEncoding(1252))

【讨论】:

  • 谢谢,点赞!我给出了 csharptest 的答案,但你们都回答了我的问题。
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2014-01-12
  • 2020-06-26
相关资源
最近更新 更多