C#でURLのエンコードを行う際に、Uri.EscapeDataString
とUri.EscapeUriString
のどちらを使うべきか迷ったことはありませんか?
最近、リンクをエンコードする処理を実装する際に、Uri.EscapeDataString
ではうまくエンコードできず、Uri.EscapeUriString
を使用したところ期待どおりの結果が得られた、という経験をしました。
本記事では、その詳細と、なぜこのような違いが発生するのかを解説します。
1. EscapeDataString
とEscapeUriString
の基本的な違い
Uri.EscapeDataString
とUri.EscapeUriString
は、どちらもURLエンコードを行うメソッドですが、それぞれの用途とエンコードの挙動が異なります。
1.1 Uri.EscapeDataString
- クエリパラメータやデータの一部をエンコードするのに適している
- 予約文字(
:/?#[]@!$&'()*+,;=
)をエンコードする -
+
や/
もエンコードされるため、URL全体のエンコードには不向き
string encoded = Uri.EscapeDataString("https://example.com/search?q=C# .NET");
Console.WriteLine(encoded);
出力:
https%3A%2F%2Fexample.com%2Fsearch%3Fq%3DC%23%20.NET
1.2 Uri.EscapeUriString
- URI全体をエンコードするのに適している
- 予約文字の一部(
:/?#[]@!$&'()*+,;=
)はそのまま維持される -
/
や:
などの区切り文字はエンコードされない
string encoded = Uri.EscapeUriString("https://example.com/search?q=C# .NET");
Console.WriteLine(encoded);
出力:
https://example.com/search?q=C#%20.NET
2. なぜEscapeDataString
だとうまくエンコードできなかったのか?
今回のケースでは、リンクをエンコードする処理で Uri.EscapeDataString
を使用しました。
しかし、エンコード結果が期待どおりにならず、意図しないURLになってしまいました。
2.1 EscapeDataString
の問題点
- URL全体をエンコードしてしまうため、
:
や/
などの区切り文字もエンコードされる - その結果、ブラウザなどで適切に解釈されなくなる
例えば、以下のようなケースです。
string url = "https://example.com/search?q=C# .NET";
string encoded = Uri.EscapeDataString(url);
Console.WriteLine(encoded);
出力:
https%3A%2F%2Fexample.com%2Fsearch%3Fq%3DC%23%20.NET
このように、スラッシュ(/
)やコロン(:
)までエンコードされてしまい、リンクとして適切に機能しませんでした。
3. 解決策: EscapeUriString
を使用する
URL全体をエンコードする場合は、Uri.EscapeUriString
を使用することで、
適切にエンコードされたURLを得ることができます。
string url = "https://example.com/search?q=C# .NET";
string encoded = Uri.EscapeUriString(url);
Console.WriteLine(encoded);
出力:
https://example.com/search?q=C#%20.NET
この方法を使用することで、
-
/
や:
などの区切り文字が保持される - クエリパラメータのスペースや特殊文字のみエンコードされる
結果として、正しいURLが生成されるようになりました。
4. まとめ
-
Uri.EscapeDataString
は、データ部分のエンコード向き。URL全体のエンコードには不向き。 -
Uri.EscapeUriString
は、URL全体をエンコードする場合に適している。 - URLエンコードを行う際は、用途に応じて適切なメソッドを選ぶことが重要。
今回のケースでは、リンクをエンコードする用途において、EscapeUriString
の方が適していました。
URLのエンコード処理で同じような問題に遭遇した方の参考になれば幸いです!