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のエンコード処理で同じような問題に遭遇した方の参考になれば幸いです!