全角から半角へ変換。全角を半角へ変換、他

C#VBのStrConv関数みたいなのがない様子。
調べたらVBでも最終的にAPIを使って変換しているらしい。
それならC#からAPIを呼び出してもいいやってことで、とりあえず動くものが完成。
覚え書きとして記録。

using System;
using System.Text;
using System.Runtime.InteropServices;

namespace Panda728.Utility
{
    /// 
    /// 指定に従って変換された文字列型 (String) の値を返します。
    /// 
    public class StrConv
    {
        /// 
        /// LCMapStringA ある文字列を別の文字列にマップする。
        ///         
        [DllImport("kernel32.dll", SetLastError=true)]
        private static extern int LCMapStringA ( int Locale, int dwMapFlags, 
            string lpSrcStr, int cchSrc, StringBuilder lpDestStr, int cchDest); 

        /// 
        /// GetSystemDefaultLCID ロケール識別子を取得
        ///         
        [DllImport("kernel32.dll")]
        private static extern int GetSystemDefaultLCID();
        
        /// 
        /// マッピング定数
        ///         
        private const int LCMAP_LOWERCASE = 0x100;
        private const int LCMAP_UPPERCASE = 0x200;
        private const int LCMAP_HIRAGANA = 0x100000;
        private const int LCMAP_KATAKANA = 0x200000;
        private const int LCMAP_HALFWIDTH = 0x400000;
        private const int LCMAP_FULLWIDTH = 0x800000;

        /// 
        /// バイト数をカウントするために使用するShift_JISエンコード
        ///         
        private static Encoding enc = System.Text.Encoding.GetEncoding("Shift_JIS");

        /// 
        /// 文字列内の全角文字 (2 バイト) を半角文字 (1 バイト) に変換します。
        ///         
        /// 変換元の文字列
         /// 変換結果
        /// 
        /// メソッドの使用例
        /// 
        /// string s = StrConv.ToNarrow( "123ABCあいうアイウ" );
        /// 
        /// 
        /// Console.WriteLine( s ); //"123aBc123AbCあいうアイウ"
        /// 
        /// 
        public static string ToNarrow( string str )
        {
            StringBuilder sb = new StringBuilder( enc.GetByteCount(str) );
            LCMapStringA( GetSystemDefaultLCID(), LCMAP_HALFWIDTH, str, -1, sb, sb.MaxCapacity );
            return sb.ToString().Replace("\0","");
        }

        /// 
        /// 文字列内の半角文字 (1 バイト) を全角文字 (2 バイト) に変換します。
        ///         
        /// 変換元の文字列
        /// 変換結果
        /// 
        /// メソッドの使用例
        /// 
        /// string s = StrConv.ToNarrow( "123ABCあいうアイウ" );
        /// 
        /// 
        /// Console.WriteLine( s ); //"123aBc123AbCあいうアイウ"
        /// 
        /// 
        public static string ToWide( string str )
        {
            StringBuilder sb = new StringBuilder( enc.GetByteCount(str) * 2 );
            LCMapStringA( GetSystemDefaultLCID(), LCMAP_FULLWIDTH, str, -1, sb, sb.MaxCapacity );
            return sb.ToString().Replace("\0","");
        }

        /// 
        /// 文字列を大文字に変換します。
        ///         
        /// 変換元の文字列
        /// 変換結果
        /// 
        /// メソッドの使用例
        /// 
        /// string s = StrConv.ToUpperCase( "123aBc123AbCあいうアイウ" );
        /// 
        /// 
        /// Console.WriteLine( s ); //"123ABC123ABCあいうアイウ"
        /// 
        /// 
        public static string ToUpperCase( string str )
        {
            StringBuilder sb = new StringBuilder( enc.GetByteCount(str) );
            LCMapStringA( GetSystemDefaultLCID(), LCMAP_UPPERCASE, str, -1, sb, sb.MaxCapacity );
            return sb.ToString().Replace("\0","");
        }

        /// 
        /// 文字列を小文字に変換します。 
        ///         
        /// 変換元の文字列
        /// 変換結果
        /// 
        /// メソッドの使用例
        /// 
        /// string s = StrConv.ToLowerCase( "123aBc123AbCあいうアイウ" );
        /// 
        /// 
        /// Console.WriteLine( s ); //"123abc123abcあいうアイウ"
        /// 
        /// 
        public static string ToLowerCase( string str )
        {
            StringBuilder sb = new StringBuilder( enc.GetByteCount(str) );
            LCMapStringA( GetSystemDefaultLCID(), LCMAP_LOWERCASE, str, -1, sb, sb.MaxCapacity );
            return sb.ToString().Replace("\0","");
        }

        /// 
        /// 文字列内のひらがなをカタカナに変換します。
        ///         
        /// 変換元の文字列
        /// 変換結果
        /// 
        /// メソッドの使用例
        /// 
        /// string s = StrConv.ToLowerCase( "123aBc123AbCあいうアイウ" );
        /// 
        /// 
        /// Console.WriteLine( s ); //"123aBc123AbCアイウアイウ"
        /// 
        /// 
        public static string ToKatakana( string str )
        {
            StringBuilder sb = new StringBuilder( str.Length * 2);
            LCMapStringA( GetSystemDefaultLCID(), LCMAP_KATAKANA, str, -1, sb, sb.MaxCapacity );
            return sb.ToString().Replace("\0","");
        }

        /// 
        /// 文字列内のカタカナをひらがなに変換します。 
        ///         
        /// 変換元の文字列
        /// 変換結果
        /// 
        /// メソッドの使用例
        /// 
        /// string s = StrConv.ToLowerCase( "123aBc123AbCあいうアイウ" );
        /// 
        /// 
        /// Console.WriteLine( s ); //"123aBc123AbCあいうアイウ"
        /// 
        /// 
        public static string ToHiragana( string str )
        {
            StringBuilder sb = new StringBuilder( enc.GetByteCount(str) );
            LCMapStringA( GetSystemDefaultLCID(), LCMAP_HIRAGANA, str, -1, sb, sb.MaxCapacity );
            return sb.ToString().Replace("\0","");
        }
    }
}