18
13

More than 5 years have passed since last update.

文字列の全角・半角変換

Posted at

stringに全角・半角変換処理の拡張メソッドを追加する

変換処理には、WIN32APIのLCMapStringを利用してます。

static class StringUtil
{
    // WIN32API:LCMapStringWの宣言
    [DllImport("kernel32.dll")]
    static extern private int LCMapStringW(int Locale, uint dwMapFlags,
        [MarshalAs(UnmanagedType.LPWStr)]string lpSrcStr, int cchSrc,
        [MarshalAs(UnmanagedType.LPWStr)] string lpDestStr, int cchDest);

    public enum dwMapFlags : uint
    {
        NORM_IGNORECASE = 0x00000001,           //大文字と小文字を区別しません。
        NORM_IGNORENONSPACE = 0x00000002,       //送りなし文字を無視します。このフラグをセットすると、日本語アクセント文字も削除されます。
        NORM_IGNORESYMBOLS = 0x00000004,        //記号を無視します。
        LCMAP_LOWERCASE = 0x00000100,           //小文字を使います。
        LCMAP_UPPERCASE = 0x00000200,           //大文字を使います。
        LCMAP_SORTKEY = 0x00000400,             //正規化されたワイド文字並び替えキーを作成します。
        LCMAP_BYTEREV = 0x00000800,             //Windows NT のみ : バイト順序を反転します。たとえば 0x3450 と 0x4822 を渡すと、結果は 0x5034 と 0x2248 になります。
        SORT_STRINGSORT = 0x00001000,           //区切り記号を記号と同じものとして扱います。
        NORM_IGNOREKANATYPE = 0x00010000,       //ひらがなとカタカナを区別しません。ひらがなとカタカナを同じと見なします。
        NORM_IGNOREWIDTH = 0x00020000,          //シングルバイト文字と、ダブルバイトの同じ文字とを区別しません。
        LCMAP_HIRAGANA = 0x00100000,            //ひらがなにします。
        LCMAP_KATAKANA = 0x00200000,            //カタカナにします。
        LCMAP_HALFWIDTH = 0x00400000,           //半角文字にします(適用される場合)。
        LCMAP_FULLWIDTH = 0x00800000,           //全角文字にします(適用される場合)。
        LCMAP_LINGUISTIC_CASING = 0x01000000,   //大文字と小文字の区別に、ファイルシステムの規則(既定値)ではなく、言語上の規則を使います。LCMAP_LOWERCASE、または LCMAP_UPPERCASE とのみ組み合わせて使えます。
        LCMAP_SIMPLIFIED_CHINESE = 0x02000000,  //中国語の簡体字を繁体字にマップします。
        LCMAP_TRADITIONAL_CHINESE = 0x04000000, //中国語の繁体字を簡体字にマップします。
    }

    // 文字列を変換する
    public static string StringConvert(this string str, dwMapFlags flags)
    {
        var ci = System.Globalization.CultureInfo.CurrentCulture;
        string result = new string(' ', str.Length);
        LCMapStringW(ci.LCID, (uint)flags, str, str.Length, result, result.Length);
        return result;
    }

    // 半角を全角に変換
    public static string Han2Zen(this string str)
    {
        return StringConvert(str, dwMapFlags.LCMAP_FULLWIDTH);
    }

    // 全角を半角に変換
    public static string Zen2Han(this string str)
    {
        return StringConvert(str, dwMapFlags.LCMAP_HALFWIDTH | dwMapFlags.LCMAP_KATAKANA);
    }
}

使い方

static void Main(string[] args)
{
    string s1 = "アイウエオかきくけこABCDEFG";
    Console.WriteLine("{0} → {1}", s1, s1.Zen2Han());
    string s2 = "abcdefgアイウエオ";
    Console.WriteLine("{0} → {1}", s2, s2.Han2Zen());
}

実行例

アイウエオかきくけこABCDEFG → アイウエオカキクケコABCDEFG
abcdefgアイウエオ → abcdefgアイウエオ

18
13
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
18
13