文字列

文字列リテラル (string literals)

string str = "ABC";
標準リテラル文字列と逐語的リテラル文字列 - 文字列 (C# プログラミング ガイド) | Microsoft Docs
"ABC".GetType().FullName; // "System.String"

逐語的文字列 (verbatim strings)

エスケープが必要な文字を、それをせずに記述できるようにする機能です。これは先に@を付加することで行え、エスケープを省けるため可読性を向上できます。標準リテラル文字列と逐語的リテラル文字列 - 文字列 (C# プログラミング ガイド) | Microsoft Docs

string str1 = "C:\dir\"; // error CS1009: 認識できないエスケープ シーケンスです。

string str2 = "AB // error CS1010: 定数の 新しい行です。
C";               // error CS0103: 現在のコンテキストに 'C' という名前は存在しません。
記述の相違
  標準リテラル文字列 逐語的リテラル文字列
バックスラッシュ
"C:\\dir\\";
@"C:\dir\";
改行
"AB\r\nC";
@"AB
C";
二重引用符
"AB\"C\"D";
@"AB""C""D";

挿入文字列 (interpolated strings) / 文字列補間

文字列内に式を記述でき、その結果をその位置に挿入できます。これはC# 6.0以降で利用できます。$ (C# リファレンス) | Microsoft Docs

$"text {interpolated-expression [,field-width] [:format-string] } text ..."
挿入文字列 (C#) | Microsoft Docs
int a = 123;

string str1 = $"A {a} A";   // "A 123 A"
string str2 = $"A {a,5} A"; // "A   123 A"

interpolated-expression (補間式) にコロンを用いるときには、式全体をかっこで囲みます。

string str3 = $"A {(a == 0 ? 1 : 2)} A";

インターン プール (intern pool)

宣言された文字列リテラルはすべて、インターンプールと呼ばれる場所に格納されます。そして共通の文字列はそれを参照することで、文字列用のストレージが節約されます。Remarks - String.IsInterned(String) Method (System) | Microsoft Docs

String クラス

string str1 = "abc";                                    // "abc"
String str2 = new String(new char[] { 'a', 'b', 'c' }); // "abc"

Type type1 = str1.GetType(); // System.String
Type type2 = str2.GetType(); // System.String

C#においてはstringが、System.Stringのエイリアスとなっています。文字列と System.String - 文字列 - C# プログラミング ガイド | Microsoft Docs

コンストラクタ

多数のオーバーロードがあり、さまざまな型が許容されます。

コンストラクタ 受け入れる型 処理する文字範囲 備考
String(Char, Int32) Unicode文字 (UTF-16) 全体 同一文字が連続した文字列を生成できる。1文字だけで生成したいならば、Char[]を渡す形式を用いる
String(Char*) Unicode文字配列を指すポインタ 全体  
String(Char*, Int32, Int32) Unicode文字配列を指すポインタ 指定範囲  
String(Char[]) Unicode文字配列 全体  
String(Char[], Int32, Int32) Unicode文字配列 指定範囲  
String(SByte*) 8ビット符号付き整数配列を指すポインタ 全体  
String(SByte*, Int32, Int32) 8ビット符号付き整数配列を指すポインタ 指定範囲  
String(SByte*, Int32, Int32, Encoding) 8ビット符号付き整数配列を指すポインタ 指定範囲 処理する文字のエンコーディングを指定できる
コンストラクター - String クラス (System) | MSDN

配列などから生成する場合以外ではコンストラクタを用いることはなく、

string str = "ABC";

のように文字列リテラルを代入します。

文字数

LengthプロパティはCharオブジェクトの数を返すため、Unicode文字の数と一致しないことがあります。たとえばサロゲートペアは2つのCharで表現されるため、1文字でも長さは2となります。

char[] chars = { '\uD83D', '\uDE00' };
string str = new String(chars); // "😀"
int len = str.Length; // 2

バイト数

Encoding.GetByteCount()で取得できます。Encoding.GetByteCount メソッド (System.Text) | Microsoft Docs

文字列の比較

等値

2つの文字列が等しいかどうかは、等値演算子で判断できます。

public static bool operator ==(
    string a,
    string b
)
String.Equality 演算子 (String, String) (System) | MSDN
string str1 = "abc";
bool r1 = str1 == "A";   // false
bool r2 = str1 == "ABC"; // false
bool r3 = str1 == "abc"; // true
String.Equals()
メソッド 比較元 比較方法
Equals(String) この文字列 標準 (StringComparison.Ordinal)
Equals(String, StringComparison) この文字列 指定の規則
Equals(String, String) 指定の文字列 標準 (StringComparison.Ordinal)
Equals(String, String, StringComparison) 指定の文字列 指定の規則
String.Equals メソッド (System) | MSDN
StringComparison列挙型
列挙子 並べ替え規則 大文字/小文字の区別
CurrentCulture 現在のカルチャ する
CurrentCultureIgnoreCase 現在のカルチャ しない
InvariantCulture 不変のカルチャ する
InvariantCultureIgnoreCase 不変のカルチャ しない
Ordinal 序数 する
OrdinalIgnoreCase 序数 しない
メンバー - StringComparison 列挙型 (System) | MSDN

相対位置

2つの文字列を並べ替える場合の、前後関係を取得できます。

public static int Compare(
    string strA,
    string strB
)
String.Compare メソッド (String, String) (System) | MSDN String.Compare メソッド (System) | MSDN
int r1 = String.Compare("a", "a"); //  0
int r2 = String.Compare("a", "b"); // -1
int r3 = String.Compare("b", "a"); //  1

int r4 = String.Compare("a", "aa"); // -1

int r6 = String.Compare("a", "");   //  1
int r7 = String.Compare("a", null); //  1
String.CompareOrdinal()
public static int CompareOrdinal (
    string strA,
    string strB
    );
CompareOrdinal(String, String) - String.CompareOrdinal メソッド (System) | Microsoft Docs

文字列の整形

書式

指定の書式によって整形された文字列を取得できます。

public static string Format(
    string format, // 書式指定文字列
    object arg0    // 整形するオブジェクト
)
String.Format メソッド (System) | MSDN
string str = String.Format("{0}:{1}", "ABC", 10); // "ABC:10"
string s0 = String.Format("{0}"         , "A");                // "A"
string s1 = String.Format("{0}{1}"      , "A", "B");           // "AB"
string s2 = String.Format("{0}{1}{2}"   , "A", "B", "C");      // "ABC"
string s3 = String.Format("{0}{1}{2}{3}", "A", "B", "C", "D"); // "ABCD"
カスタム書式
public static string Format (
    IFormatProvider provider,
    string format,
    object arg0
    );
Format(IFormatProvider, String, Object) - String.Format メソッド (System) | Microsoft Docs
public class MyFormat : IFormatProvider, ICustomFormatter
{
    public object GetFormat(Type formatType)
    {
        if (formatType == typeof(ICustomFormatter))
        {
            return this;
        }
        else
        {
            return null;
        }
    }

    public string Format(string format, object arg, IFormatProvider formatProvider)
    {
        if (!object.ReferenceEquals(this, formatProvider))
        {
            return null;
        }

        Type type = arg.GetType();
        if (type == typeof(int))
        {
            int val = (int)arg;
            switch (format)
            {
                case "A":
                    return (val * 2).ToString();
                case "B":
                    return (val * 3).ToString();
            }
        }

        return arg.ToString();
    }
}
string str = String.Format(new MyFormat(), "{0:A}-{0:B}", num); // 4-6
例 - 方法: カスタム数値書式プロバイダーを定義して使用する | Microsoft Docs

削除

public string Remove(
    int startIndex, // 削除を開始する位置
    int count       // 削除する文字数
)
String.Remove メソッド (Int32, Int32) (System) | MSDN
"ABCD".Remove(1);   // "A"
"ABCD".Remove(2);   // "AB"
"ABCD".Remove(1,2); // "AD"

刈り込み

先頭と末尾から、空白文字または指定文字を削除できます。

public string Trim()
String.Trim メソッド (System) | MSDN
" ABC ".Trim(); // "ABC"

.NET Framework 4以降、引数なしのこのメソッドではすべてのUnicode空白文字が除去されます。対象となる文字は.NET 3.5 SP1の前後で変更されており、

  • .NET 4以降、対象から除外
    • ZERO WIDTH SPACE (U+200B)
    • ZERO WIDTH NO-BREAK SPACE (U+FEFF)
  • .NET 4以降、対象に追加
    • MONGOLIAN VOWEL SEPARATOR (U+180E)
    • NARROW NO-BREAK SPACE (U+202F)
    • MEDIUM MATHEMATICAL SPACE (U+205F)

となっています。Remarks - String.Trim Method (System) | MSDN

public string Trim(params char[] trimChars)
String.Trim メソッド (Char[]) (System) | MSDN

引数をとるメソッドでは、除去する文字を指定できます。

" ABC ".Trim(' ', 'A'); // "BC"

これを利用すれば、.NET 4以降に対象から除外された文字を除去できます。

str.Trim('\u200B', '\uFEFF');

Trim()では先頭と末尾から除去されますが、TrimStrat()とTrimEnd()ではそのいずれかだけを対象にできます。

public string TrimStart(params char[] trimChars)
public string TrimEnd(params char[] trimChars)

文字列の連結

加算演算子

加算演算子 (+) で文字列同士を連結、加算代入演算子 (+=) で文字列に対して連結できます。

string str = "AA" + "BB"; // "AABB"
str += 10;                // "AABB10"

多数の文字列を連結するならば、StringBuilderを用います。

String.Concat()

複数のオブジェクトまたはStringを、文字列として連結できます。

public static string Concat(
    object arg0,
    object arg1
)
String.Concat メソッド (Object, Object) (System) | MSDN String.Concat メソッド (System) | MSDN
String.Concat("ABC", true);    // "ABCTrue"
String.Concat(10, 'a');        // "10a"
String.Concat(1.5, null, 'B'); // "1.5B"

可変引数をとるオーバーロードもあり、任意の数のオブジェクトを連結できます。

public static string Concat(
    params object[] args
)
String.Concat メソッド (Object[]) (System) | MSDN

ただし配列を渡した場合、それが1つならばこのメソッドで要素ごとに連結されますが、複数渡すとそれぞれの文字列形式で連結されます。

String.Concat(     new int[] { 1, 2, 3 }); // "123"
String.Concat("A", new int[] { 1, 2, 3 }); // "ASystem.Int32[]"

String.Join()

文字列配列を、指定の区切り文字で連結できます。これとは逆に、指定の区切り文字で分割するならばString.Split()を用います。

public static string Join(
    string separator,
    params string[] value
)
String.Join メソッド (String, String[]) (System) | MSDN
string[] str = new string[] { "a", "b", "c", "", "" };
Console.Write( String.Join(",", str)); // a,b,c,,
String.Join("x", 1);    // "1"
String.Join("x", 1, 2); // "1x2"

引数で開始位置と数を指定することで、連結する範囲を制限できます。

public static string Join(
    string separator,
    string[] value,
    int startIndex, // 使用する最初の要素
    int count       // 使用する要素の数
)
String.Join メソッド (String, String[], Int32, Int32) (System) | MSDN
string[] str = new string[] { "a", "b", "c" };
string r1 = String.Join(",", str, 0, 2); // "a,b"
string r2 = String.Join(",", str, 1, 2); // "b,c"

string r3 = String.Join(",", str, 3, 1); // System.ArgumentOutOfRangeException
string r4 = String.Join(",", str, 1, 3); // System.ArgumentOutOfRangeException

文字列の分割

String.Split()

public string[] Split(
    params char[] separator
)
String.Split メソッド (Char[]) (System) | MSDN

separatorがnullか、区切り文字を含まない空の配列の場合には、空白文字が区切り文字として用いられます。

string text = "a b,c";
string[] r1 = text.Split(null);           // "a", "b,c"
string[] r2 = text.Split(new char[] { }); // "a", "b,c"

separatorに単一の文字を渡すと、コンパイラによって単一要素の文字配列と解釈されます。String. Split (Char []) とコンパイラのオーバーロードの解決 - String.Split Method (System) | Microsoft Docs

string text = "a,b,c";
string[] r1 = text.Split(new char[] { ',' });
string[] r2 = text.Split(','); // OK

string[] r3 = text.Split(new string[] { "," }, StringSplitOptions.None);
string[] r4 = text.Split(",", StringSplitOptions.None); // error CS1503: 引数 1: は 'string' から 'char' へ変換することはできません。

optionsでStringSplitOptions.RemoveEmptyEntriesを指定すると、空の要素を除外できます。

[System.Runtime.InteropServices.ComVisible(false)]
public string[] Split (string[] separator, StringSplitOptions options);
Split(String[], StringSplitOptions) - String.Split Method (System) | Microsoft Docs
string[] r1 = "a,b,,c,".Split(new char[] { ',' }, StringSplitOptions.None);               // "a","b","","c",""
string[] r2 = "a,b,,c,".Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); // "a","b","c"

separatorに複数の文字列が含まれるとき、それらは大文字/小文字を区別した順に並べ替えられた上で処理されます。Comparison details - String.Split Method (System) | Microsoft Docs

string[] r1 = "abcdef".Split(new[] { "ef", "bcde" }, StringSplitOptions.None); // "a", "f"
string[] r2 = "abcdef".Split(new[] { "bcde", "ef" }, StringSplitOptions.None); // "a", "f"

string[] r3 = "abcdef".Split(new[] { "bcd", "bc" }, StringSplitOptions.None); // "a", "def"
string[] r4 = "abcdef".Split(new[] { "bc", "bcd" }, StringSplitOptions.None); // "a", "ef"

空文字列を分割すると、空文字列が返されます。

string[] r1 = "".Split(null); // ""

第2引数で数値を指定すると、分割する最大数を制限できます。

string text = "a b c";
string[] r1 = text.Split(null, 1); // "a b c"
string[] r2 = text.Split(null, 2); // "a", "b c"
string[] r3 = text.Split(null, 3); // "a", "b", "c"
string[] r4 = text.Split(null, 4); // "a", "b", "c"

文字列の抽出

public string Substring (
    int startIndex,
    int length
    );
Substring(Int32, Int32) - String.Substring Method (System) | Microsoft Docs

startIndexまたはlengthが0未満のときは、ArgumentOutOfRangeExceptionが投げられます。

string str = "012345";

string s0 = str.Substring(2);     // "2345"
string s1 = str.Substring(2, 3);  // "234"
string s2 = str.Substring(2, 10); // ArgumentOutOfRangeException

これとは逆に、指定範囲を除去した文字列を得たいならば、Remove()を呼びます。

文字列の検索

戻り値の型 メソッド 機能
bool Contains() 指定文字列が含まれているかどうか
bool StartsWith() 先頭が、指定文字列と一致するかどうか
bool EndsWith() 末尾が、指定文字列と一致するかどうか
int IndexOf() 指定文字が、最初に見つかった位置を返す
int LastIndexOf() 指定文字が、最後に見つかった位置を返す
int IndexOfAny() 指定文字のいずれかが、最初に見つかった位置を返す
int LastIndexOfAny() 指定文字のいずれかが、最後に見つかった位置を返す
方法 : String のメソッドを使用して文字列を検索する (C# プログラミング ガイド) | MSDN

高度な条件で検索するには、正規表現のRegex.Match()を用います。

文字が指定位置にあるか確認するだけならば、インデクサで判定できます。

string str = "abc";
bool r = (str[0] == 'a'); // true
public char this[int index] { get; }
String.Chars プロパティ (Int32) (System) | MSDN

Contains()

public bool Contains (string value);
Contains(String) - String.Contains メソッド (System) | Microsoft Docs

.NET FrameworkにはStringComparisonを指定するオーバーロードが用意されていないため、これが必要ならばIndexOf()を用いたメソッドを独自に定義します。

IndexOf()

指定文字が最初に見つかった位置を得られます。見つからなかった場合は、-1が返されます。

メソッド 検索対象 検索の開始位置 検索の終了位置 文字の比較方法
IndexOf(Char) 文字 最初 末尾 標準
IndexOf(Char, Int32) 文字 指定位置 末尾 標準
IndexOf(Char, Int32, Int32) 文字 指定位置 開始位置 + 指定文字数 標準
IndexOf(String) 文字列 最初 末尾 標準
IndexOf(String, Int32) 文字列 指定位置 末尾 標準
IndexOf(String, Int32, Int32) 文字列 指定位置 開始位置 + 指定文字数 標準
indexOf(String, StringComparison) 文字列 最初 末尾 指定方法
IndexOf(String, Int32, StringComparison) 文字列 指定位置 末尾 指定方法
IndexOf(String, Int32, Int32, StringComparison) 文字列 指定位置 開始位置 + 指定文字数 指定方法
String.IndexOf メソッド (System) | MSDN
int index = "01234".IndexOf('2'); // 2

文字列の置換

メソッド 機能
Replace(Char, Char) 指定文字をすべて別の文字へ置換し、置換された新しい文字列を返す
Replace(String, String) 指定文字列をすべて別の文字列へ置換し、置換された新しい文字列を返す
Remove(Int32, Int32) 指定位置から指定数の文字を空文字に置換 (削除) し、削除された新しい文字列を返す
方法: 文字列の内容を変更する - C# ガイド | Microsoft Docs
public string Replace(
    char oldChar,
    char newChar
)
String.Replace メソッド (Char, Char) (System) | MSDN
"ABC ABC".Replace('B', 'x'); // "AxC AxC"

高度な条件で置換するには、正規表現のRegex.Replace()を用います。

文字列の挿入

public string Insert (
    int startIndex,
    string value
    );
String.Insert(Int32, String) メソッド (System) | Microsoft Docs
string str = "01234".Insert(2, "A"); // "01A234"

文字列の判定

メソッド 機能
IsNormalized() この文字列が、Unicode正規形C (Unicode normalization form C) であるかどうか
IsNormalized(NormalizationForm) この文字列が、指定されたUnicode正規形であるかどうか
IsNullOrEmpty(String) 指定された文字列がnullまたはEmpty文字列であるかどうか。これは次のコードに相当する
return (s == null) || (s == String.Empty);
解説 - String.IsNullOrEmpty メソッド (String) (System) | MSDN

パフォーマンスが問題となるならば、このメソッドにより空文字を判定します。CA1820: 文字列の長さを使用して空の文字列をテストします | MSDN

IsNullOrWhiteSpace(String) 指定された文字列がnullまたは空であるか、空白文字だけで構成されているかどうか。これは次のコードに相当する
return String.IsNullOrEmpty(value) || (value.Trim().Length == 0);
解説 - String.IsNullOrWhiteSpace メソッド (String) (System) | MSDN

StringBuilder クラス

  • 不変の文字列 … String クラス
  • 可変の文字列 … StringBuilder クラス

Stringが小さい場合など、StringBuilderに置き換えてもパフォーマンスの向上を望めないことがあります。Remarks - StringBuilder Class (System.Text) | MSDN

StringBuilder sb = new StringBuilder();

sb.Append("AAA");
sb.Append(10);
string str1 = sb.ToString(); // "AAA10"

sb.Clear();

sb.Append(true);
sb.Append(new DateTime(2001, 2,3));
string str2 = sb.ToString(); // "True2001/02/03 0:00:00"

コンストラクタ

生成時に容量を指定しなかった場合は、既定で16文字となります。StringBuilder() - stringbuilder.cs

プロパティ

プロパティ 内容
int Length 現在の文字数

現在の文字数より小さな長さを指定すると、その長さまで切り詰められる。逆に大きな長さを指定すると、その長さまでUnicode NULL文字 (U+0000) で埋められる

int Capacity 割り当てられたメモリに格納できる最大文字数
int MaxCapacity 最大文字数
char Chars[Int32] 指定位置の文字

Length

StringBuilder sb = new StringBuilder();
sb.Append("123456789");

sb.Length = 3; // "123"
sb.Length = 5; // "123\0\0"

MaxCapacity

.NET 4.0以降ではMaxCapacityを指定していても、小さな文字列を追加したときはその容量を超えることがあります。Remarks - StringBuilder.MaxCapacity Property (System.Text) | Microsoft Docs

StringBuilder sb = new StringBuilder(3, 5);
sb.Append("12");
int c1 = sb.Capacity; // 3

sb.Append("34");
int c2 = sb.Capacity; // 6

// sb.Append("56"); // OK
sb.Append("56789"); // System.ArgumentOutOfRangeException

メソッド

主要なメソッド
区分 メソッド 機能
追加 Append(Object) 指定オブジェクトの文字列形式を、末尾に追加
AppendFormat(String, Object) 指定オブジェクトを、書式指定して末尾に追加
AppendLine(String) 指定文字列と既定の行終端記号 (line terminator) を、末尾に追加
(既定の行終端記号はEnvironment.NewLine)
挿入 Insert(Int32, Object) 指定オブジェクトの文字列形式を、指定位置に追加
Insert(Int32, String, Int32) 指定文字列を指定回数だけ、指定位置に追加
削除 Clear() すべての文字を削除
Remove(Int32, Int32) 指定範囲の文字を削除
置換 Replace(String, String) すべての、指定文字列をすべて別の指定文字列に置換
Replace(String, String, Int32, Int32) 指定範囲の、指定文字列をすべて別の指定文字列に置換
変換 ToString() Stringに変換
メソッド - StringBuilder クラス (System.Text) | Microsoft Docs

StringBuilderのメソッドはStringのそれとは異なり、インスタンス自身が変更されます。

StringCollection クラス

文字列のコレクションを表せます。

StringCollection sc = new StringCollection();
sc.Add("a");
sc.Add("b");

sc.Insert(1, "z");
sc.Remove("a");

int index = sc.IndexOf("z");
bool contain = sc.Contains("b");

foreach (string item in sc)
{
    Console.Write(item);
}
StringCollection クラス (System.Collections.Specialized) | Microsoft Docs

型変換

数値への変換

int a = Int32.Parse("123");
int b = Int32.Parse("0x10"); // System.FormatException
int c = Int32.Parse("A");    // System.FormatException
Int32.Parse メソッド (String) (System) | MSDN

Parse()では変換の失敗時に例外が発生します。それが例外的な事象ではないならば、失敗を考慮してTryParse()で処理します。

nt a = 10;
if(Int32.TryParse("123", out a))
{
    Console.Write(a); // 123
}

int b = 10;
if(Int32.TryParse("A", out b))
{
}
else
{
    Console.Write(b); // 0 (変換に失敗した場合は、その型の既定値になる)
}
Int32.TryParse メソッド (String, Int32) (System) | MSDN

10進以外の変換

Int32.Parse()でスタイルを指定して解析するか、Convert.ToInt32()で基数を指定して変換します。

int num1 = Int32.Parse("10", System.Globalization.NumberStyles.HexNumber); // 16
int num2 = Convert.ToInt32("10", 16); // 16
public static int Parse(
    string s,
    NumberStyles style
)
Int32.Parse メソッド (String, NumberStyles) (System) | MSDN
public static int ToInt32(
    string value,
    int fromBase // 基数。2、8、10または16
)
Convert.ToInt32 メソッド (String, Int32) (System) | MSDN

16進数以外も考えるならば、基数を指定して変換できるConvert.ToInt32()の方が融通がききます。

文字配列への変換

public void CopyTo(
    int sourceIndex,
    char[] destination,
    int destinationIndex,
    int count
)
String.CopyTo メソッド (Int32, Char[], Int32, Int32) (System) | MSDN
string source = "ABC";
char[] destination = new char[source.Length];

source.CopyTo(0, destination, 0, destination.Length);

C#のchar (System.Char) はC++のwchar_tに相当するため、C++のcharに変換するにはMarshalクラスのメソッドを用います。

ポインタへの変換

文字列へsbyteのポインタからアクセスできるようにするには、次のようにします。unmanaged - C#: Converting String to Sbyte* - Stack Overflow

string source = "abc";

byte[] bytes = Encoding.ASCII.GetBytes(source);
unsafe
{
    fixed (byte* pByte = bytes)
    {
        // ポインタを取得する
        sbyte* pSbyte = (sbyte*)pByte;

        // stringへ戻して確認する
        string str = new string(pSbyte); // "abc"
    }
}

ただしこの方法では、ASCII文字以外は適切に処理できません。

任意の型への変換

TypeConverter.ConvertFromString()を用いれば、変換する型を動的に決定できます。.net - C#: Dynamic parse from System.Type - Stack Overflow

static object Parse(Type type, string text)
{
    System.ComponentModel.TypeConverter typeConverter = System.ComponentModel.TypeDescriptor.GetConverter(type);
    return typeConverter.ConvertFromString(text);
}

文字コードの変換

HTMLエンコード

public static string HtmlEncode(
    string s
)
HttpUtility.HtmlEncode メソッド (String) (System.Web) | MSDN
string s1 = HttpUtility.HtmlEncode("ABC ' \" < > & あ"); // "ABC &#39; &quot; &lt; &gt; &amp; あ"

URLエンコード

public static string UrlEncode(
    string str
)
HttpUtility.UrlEncode メソッド (String) (System.Web) | MSDN
string s2 = HttpUtility.UrlEncode("ABC ; , / あ"); // "ABC+%3b+%2c+%2f+%e3%81%82"

参考

参考書

MSDN (Microsoft Developer Network) から検索