1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

C#のURLエンコード: EscapeDataStringとEscapeUriStringの違い

Posted at

C#でURLのエンコードを行う際に、Uri.EscapeDataStringUri.EscapeUriStringのどちらを使うべきか迷ったことはありませんか?

最近、リンクをエンコードする処理を実装する際に、Uri.EscapeDataStringではうまくエンコードできず、Uri.EscapeUriStringを使用したところ期待どおりの結果が得られた、という経験をしました。

本記事では、その詳細と、なぜこのような違いが発生するのかを解説します。


1. EscapeDataStringEscapeUriStringの基本的な違い

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?