C#でのURL文字列エンコードの方法とは?デコードの方法もあわせて紹介
- システム
エンジニア - URLエンコードとはどういったプログラムなのでしょうか?
- プロジェクト
マネージャー - URLで表記されない文字や記号を特殊な組み合わせで表記する変換記号のことです。詳しくみていきましょう。
C#でのURLのエンコードとは?
今回は、C#でのURLのエンコードについて説明します。
URLエンコードとは、URLでは使えない文字を変換することです。
例えば、「あ」は「%e3%81%82」に変換されます。
URLはアルファベットだけで表現する必要があるため、このように変換します。
C#でのURLのエンコードに興味のある方はぜひご覧ください。
C#でのURLエンコードの方法4つ
C#では4種類の方法でURLエンコードができます。
そして、それぞれの方法で文字列をどのようにエンコードするかが異なります。
では、それぞれの方法について、実際のソースコードとエンコード例を交えて紹介します。
1:HttpUtility.UrlEncodeメソッド
C#ではHttpUtility.UrlEncodeメソッドを使って、URLのエンコードができます。
HttpUtilityクラスを使用するには、System.Web.dllを参照設定に追加してください。
どのようにエンコードされるか、実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
Console.WriteLine(System.Web.HttpUtility.UrlEncode("abcdefg"));
Console.WriteLine(System.Web.HttpUtility.UrlEncode("ABCDEFG"));
Console.WriteLine(System.Web.HttpUtility.UrlEncode("0123456"));
Console.WriteLine(System.Web.HttpUtility.UrlEncode("!()_-*."));
Console.WriteLine(System.Web.HttpUtility.UrlEncode("あいうえお"));
Console.WriteLine(System.Web.HttpUtility.UrlEncode("アイウエオ"));
Console.WriteLine(System.Web.HttpUtility.UrlEncode("亜伊宇絵尾"));
Console.WriteLine(System.Web.HttpUtility.UrlEncode(" "));
Console.WriteLine(System.Web.HttpUtility.UrlEncode("?#$%&|@\\/[]{}<>+=^~\"'`;:,"));
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
abcdefg
ABCDEFG
0123456
!()_-*.
%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a
%e3%82%a2%e3%82%a4%e3%82%a6%e3%82%a8%e3%82%aa
%e4%ba%9c%e4%bc%8a%e5%ae%87%e7%b5%b5%e5%b0%be
+
%3f%23%24%25%26%7c%40%5c%2f%5b%5d%7b%7d%3c%3e%2b%3d%5e%7e%22%27%60%3b%3a%2c
|
ただし、半角スペースは「+」にエンコードされます。
それ以外は、文字コードを16進数文字列に変換し、2桁ごとに「%」を付けた形式にエンコードされます。
このように、C#ではHttpUtility.UrlEncodeメソッドを使って、URLのエンコードができます。
文字コードの指定
HttpUtility.UrlEncodeメソッドでは、文字コードを指定しないとUTF-8としてエンコードします。
文字コードの指定による違いを確認するため、実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
string str = "あいうえお";
System.Text.Encoding enc_utf8 = System.Text.Encoding.GetEncoding("UTF-8");
System.Text.Encoding enc_euc = System.Text.Encoding.GetEncoding("euc-jp");
System.Text.Encoding enc_sjis = System.Text.Encoding.GetEncoding("Shift_Jis");
Console.WriteLine(System.Web.HttpUtility.UrlEncode(str));
Console.WriteLine(System.Web.HttpUtility.UrlEncode(str, enc_utf8));
Console.WriteLine(System.Web.HttpUtility.UrlEncode(str, enc_euc));
Console.WriteLine(System.Web.HttpUtility.UrlEncode(str, enc_sjis));
|
1
2
3
4
5
6
7
8
9
10
|
%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a
%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a
%a4%a2%a4%a4%a4%a6%a4%a8%a4%aa
%82%a0%82%a2%82%a4%82%a6%82%a8
|
“euc-jp”や”Shift_Jis”を指定すると、指定した文字コードでエンコードします。
2:WebUtility.UrlEncodeメソッド
C#ではWebUtility.UrlEncodeメソッドを使って、URLのエンコードができます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
Console.WriteLine(System.Net.WebUtility.UrlEncode("abcdefg"));
Console.WriteLine(System.Net.WebUtility.UrlEncode("ABCDEFG"));
Console.WriteLine(System.Net.WebUtility.UrlEncode("0123456"));
Console.WriteLine(System.Net.WebUtility.UrlEncode("!()_-*."));
Console.WriteLine(System.Net.WebUtility.UrlEncode("あいうえお"));
Console.WriteLine(System.Net.WebUtility.UrlEncode("アイウエオ"));
Console.WriteLine(System.Net.WebUtility.UrlEncode("亜伊宇絵尾"));
Console.WriteLine(System.Net.WebUtility.UrlEncode(" "));
Console.WriteLine(System.Net.WebUtility.UrlEncode("?#$%&|@\\/[]{}<>+=^~\"'`;:,"));
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
|
abcdefg
ABCDEFG
0123456
!()_-*.
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
%E3%82%A2%E3%82%A4%E3%82%A6%E3%82%A8%E3%82%AA
%E4%BA%9C%E4%BC%8A%E5%AE%87%E7%B5%B5%E5%B0%BE
+
%3F%23%24%25%26%7C%40%5C%2F%5B%5D%7B%7D%3C%3E%2B%3D%5E%7E%22%27%60%3B%3A%2C
|
このように、C#ではWebUtility.UrlEncodeメソッドを使って、URLのエンコードができます。
3:Uri.EscapeDataStringメソッド
C#ではUri.EscapeDataStringメソッドを使って、URLのエンコードができます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
|
Console.WriteLine(Uri.EscapeDataString("abcdefg"));
Console.WriteLine(Uri.EscapeDataString("ABCDEFG"));
Console.WriteLine(Uri.EscapeDataString("0123456"));
Console.WriteLine(Uri.EscapeDataString("_-.~"));
Console.WriteLine(Uri.EscapeDataString("あいうえお"));
Console.WriteLine(Uri.EscapeDataString("アイウエオ"));
Console.WriteLine(Uri.EscapeDataString("亜伊宇絵尾"));
Console.WriteLine(Uri.EscapeDataString(" "));
Console.WriteLine(Uri.EscapeDataString("!()*?#$%&|@\\/[]{}<>+=^\"'`;:,"));
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
abcdefg
ABCDEFG
0123456
_-.~
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
%E3%82%A2%E3%82%A4%E3%82%A6%E3%82%A8%E3%82%AA
%E4%BA%9C%E4%BC%8A%E5%AE%87%E7%B5%B5%E5%B0%BE
%20
%21%28%29%2A%3F%23%24%25%26%7C%40%5C%2F%5B%5D%7B%7D%3C%3E%2B%3D%5E%22%27%60%3B%3A%2C
|
ただし、半角スペースは「%20」にエンコードします。
これは、RFC3986に従ったエンコード方法です。
このように、C#ではUri.EscapeDataStringメソッドを使って、URLのエンコードができます。
4:Uri.EscapeUriStringメソッド
C#ではUri.EscapeUriStringメソッドを使って、URLのエンコードができます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
|
Console.WriteLine(Uri.EscapeUriString("abcdefg"));
Console.WriteLine(Uri.EscapeUriString("ABCDEFG"));
Console.WriteLine(Uri.EscapeUriString("0123456"));
Console.WriteLine(Uri.EscapeUriString("_-.~"));
Console.WriteLine(Uri.EscapeUriString("!()*?#$&@/[]+=';:,"));
Console.WriteLine(Uri.EscapeUriString("%|\\{}<>^\"`"));
Console.WriteLine(Uri.EscapeUriString("あいうえお"));
Console.WriteLine(Uri.EscapeUriString("アイウエオ"));
Console.WriteLine(Uri.EscapeUriString("亜伊宇絵尾"));
Console.WriteLine(Uri.EscapeUriString(" "));
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
abcdefg
ABCDEFG
0123456
_-.~
!()*?#$&@/[]+=';:,
%25%7C%5C%7B%7D%3C%3E%5E%22%60
%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A
%E3%82%A2%E3%82%A4%E3%82%A6%E3%82%A8%E3%82%AA
%E4%BA%9C%E4%BC%8A%E5%AE%87%E7%B5%B5%E5%B0%BE
%20
|
これらの文字をエンコードしたくない場合は、Uri.EscapeUriStringを使用します。
このように、C#ではUri.EscapeUriStringメソッドを使って、URLのエンコードができます。
プログラミング言語における文字列型とは
まず、文字列とはテキストを表すために使用される0以上の文字からなる順序のある集合のことです。
例えば、”abc”、”あいうえお”、”!”、””などが文字列になります。
そして、プログラミング言語において、このような文字列を扱うための型が文字列型と呼ばれるものになります。
C#でのstring型について
C#での基本の文字列型はstring型になります。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
|
string str1 = "abcdefg";
string str2 = "あいうえお";
string str3 = "亜伊宇絵尾";
Console.WriteLine(str1);
Console.WriteLine(str2 + str3); // 文字列の連結
|
実行結果は以下のようになります。
1
2
|
abcdefg
あいうえお亜伊宇絵尾
|
string型の問題点
C#のstring型はUTF-16という文字コードでデータを格納しています。
これはstring型で格納された文字列をバイト単位で出力することで確かめられます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
string str = "あいうえお";
Console.WriteLine(str);
unsafe
{
fixed (char* char_p = str)
{
byte* byte_p = (byte*)char_p;
for (int i = 0; i < (str.Length + 1) * 2; i++)
{
byte bt = *(byte_p + i);
Console.Write(bt.ToString("X2") + " ");
}
}
}
|
実行結果は以下のようになります。
1
2
|
あいうえお
42 30 44 30 46 30 48 30 4A 30 00 00
|
つまり「あ」が「42 30」と対応しており、これはUTF-16の文字コードと合致します。
これにより、string型の文字列の文字コードはUTF-16であるとわかります。
しかし、昨今のWebアプリケーションなどではUTF-8という文字コードを使用するのが一般的です。
UTF-8形式の文字列を扱うにあたり、わざわざUTF-16に文字コード変換して処理するとなるとコストがかかってしまいます。
そのため、C#でUTF-8のまま文字列処理ができるような機能が求められています。
C#でのUtf8String型について
そこで、考案されているものがUtf8String型というデータ型です。
これによりUTF-8形式のデータをそのまま扱えます。
実際のソースコードを見てみましょう。
(ここではMicrosoft.Azure.Cosmos.Core.Utf8のUtf8Stringを使用しています)
1
2
3
4
5
6
7
8
9
10
11
|
string str = "あいうえお";
Byte[] dats = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(str); // UTF-8バイト列に変換
foreach (byte dat in dats)
{
Console.Write(dat.ToString("X2") + " ");
}
Console.WriteLine();
Utf8String u8str = Utf8String.Empty;
Utf8String.TryParseUtf8Bytes(dats, out u8str);
Console.WriteLine(u8str);
|
実行結果は以下のようになります。
1
2
|
E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A
あいうえお
|
このように、Utf8Stringを使用することでUTF-8のバイト列を文字列としてそのまま扱えるようになります。
C#でのURLデコードの方法
ここまでURLエンコードについて説明してきましたが、エンコードによって変換された文字列はしかるべきタイミングで元の状態に戻す必要があります。
この元の状態に戻す処理のことをデコードと呼びます。
C#ではURLデコードの方法が2種類あります。
それぞれの方法について、実際のソースコードとデコード例を交えて紹介します。
HttpUtility.UrlDecodeメソッドを使用
C#ではHttpUtility.UrlDecodeメソッドを使って、URLのデコードができます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
|
Console.WriteLine(System.Web.HttpUtility.UrlDecode("%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a"));
Console.WriteLine(System.Web.HttpUtility.UrlDecode("%e3%82%a2%e3%82%a4%e3%82%a6%e3%82%a8%e3%82%aa"));
Console.WriteLine(System.Web.HttpUtility.UrlDecode("%E4%BA%9C%E4%BC%8A%E5%AE%87%E7%B5%B5%E5%B0%BE")); //大文字を使用した場合
Console.WriteLine(System.Web.HttpUtility.UrlDecode("a+b")); // 半角スペースを+に変換した場合
Console.WriteLine(System.Web.HttpUtility.UrlDecode("c%20d")); // 半角スペースを%20に変換した場合
Console.WriteLine(System.Web.HttpUtility.UrlDecode("%3f%23%24%25%26%7c%40%5c%2f%5b%5d%7b%7d%3c%3e%2b%3d%5e%7e%22%27%60%3b%3a%2c"));
Console.WriteLine(System.Web.HttpUtility.UrlDecode("%21%28%29%2A%3F%23%24%25%26%7C%40%5C%2F%5B%5D%7B%7D%3C%3E%2B%3D%5E%22%27%60%3B%3A%2C"));
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
|
あいうえお
アイウエオ
亜伊宇絵尾
a b
c d
?#$%&|@\/[]{}<>+=^~"'`;:,
!()*?#$%&|@\/[]{}<>+=^"'`;:,
|
半角スペースに関しても、「+」、「%20」どちらも復元されています。
このように、C#ではHttpUtility.UrlDecodeメソッドを使って、URLのデコードができます。
Uri.UnescapeDataStringメソッドを使用
C#ではUri.UnescapeDataStringメソッドを使って、URLのデコードができます。
実際のソースコードを見てみましょう。
1
2
3
4
5
6
7
|
Console.WriteLine(System.Uri.UnescapeDataString("%e3%81%82%e3%81%84%e3%81%86%e3%81%88%e3%81%8a"));
Console.WriteLine(System.Uri.UnescapeDataString("%e3%82%a2%e3%82%a4%e3%82%a6%e3%82%a8%e3%82%aa"));
Console.WriteLine(System.Uri.UnescapeDataString("%E4%BA%9C%E4%BC%8A%E5%AE%87%E7%B5%B5%E5%B0%BE")); //大文字を使用した場合
Console.WriteLine(System.Uri.UnescapeDataString("a+b")); // 半角スペースを+に変換した場合
Console.WriteLine(System.Uri.UnescapeDataString("c%20d")); // 半角スペースを%20に変換した場合
Console.WriteLine(System.Uri.UnescapeDataString("%3f%23%24%25%26%7c%40%5c%2f%5b%5d%7b%7d%3c%3e%2b%3d%5e%7e%22%27%60%3b%3a%2c"));
Console.WriteLine(System.Uri.UnescapeDataString("%21%28%29%2A%3F%23%24%25%26%7C%40%5C%2F%5B%5D%7B%7D%3C%3E%2B%3D%5E%22%27%60%3B%3A%2C"));
|
実行結果は以下のようになります。
1
2
3
4
5
6
7
|
あいうえお
アイウエオ
亜伊宇絵尾
a+b
c d
?#$%&|@\/[]{}<>+=^~"'`;:,
!()*?#$%&|@\/[]{}<>+=^"'`;:,
|
そのため、HttpUtility.UrlEncodeやWebUtility.UrlEncodeでエンコードされたものに対して使用すると、半角スペースのみ復元できない可能性があります。
C#ではUri.EscapeDataStringやUri.EscapeUriStringに対応して使うと良いでしょう。
このように、C#ではUri.UnescapeDataStringメソッドを使って、URLのデコードができます。
- システム
エンジニア - 文字コードの表記パターンが4種類もあるのですね。
- プロジェクト
マネージャー - それぞれのメソッドを実際に書いてみて、より理解を深めていってください。
C#でのURL文字列エンコードの方法を知ろう
C#でのURLのエンコード方法を4種類、デコード方法を2種類紹介しました。
また、C#における文字列型とその問題点についても紹介しました。
ぜひご自身でソースコードを書いて、理解を深めてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)