URLの一部として渡さなければならないパラメータがあります。パラメータには次の文字が含まれています:ß
この文字列をエンコードすると、次のようになります:%DFが、代わりに次のようになります:%c3%9f
これが私がテストに使用しているC#の行です
string test = HttpUtility.UrlEncode("ß");
これは、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コードページを使用してください。
ß
文字は、UTF-8エンコーディングを使用する場合と同じようにエンコードされます%c3%9f
。可能であれば、これを使用する必要があります。
ターゲットWebサーバーが他のエンコーディングを使用している場合は、それがどのエンコーディングであるかを正確に知る必要があります。その文字をエンコードしたいので、%df
Windows -1252またはWindows-1250(またはおそらく他のもの)である可能性があります。
これがあなたのやりたいことであると確信している場合は、次を使用できます(Windows-1252を想定)。
HttpUtility.UrlEncode("ß", Encoding.GetEncoding(1252))