0

URLの一部として渡さなければならないパラメータがあります。パラメータには次の文字が含まれています:ß

この文字列をエンコードすると、次のようになります:%DFが、代わりに次のようになります:%c3%9f

これが私がテストに使用しているC#の行です

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

2 に答える 2

6

これは、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コードページを使用してください。

于 2012-05-01T23:56:59.397 に答える
4

ß文字は、UTF-8エンコーディングを使用する場合と同じようにエンコードされます%c3%9f。可能であれば、これを使用する必要があります。

ターゲットWebサーバーが他のエンコーディングを使用している場合は、それがどのエンコーディングであるかを正確に知る必要があります。その文字をエンコードしたいので、%dfWindows -1252またはWindows-1250(またはおそらく他のもの)である可能性があります。

これがあなたのやりたいことであると確信している場合は、次を使用できます(Windows-1252を想定)。

HttpUtility.UrlEncode("ß", Encoding.GetEncoding(1252))
于 2012-05-01T23:48:35.883 に答える