Top / .NET備忘録 / 11.文字列の扱い / 02.シフトJISに変換可能な文字

散々お世話になった、StrConv 関数。

Microsoft.VisualBasic 名前空間の Strings クラスに互換機能である、StrConv メソッドがありますが、シフト JIS に変換できない文字を通すと文字化けします。

Debug.Print(StrConv("カナ佸", VbStrConv.Hiragana))

実行結果: かな?

なので、互換機能を作ってしまうことにします。

(1) vbUnicode は、変換前に実行します。
(2) 文字列のうち、シフト JIS に変換できない部分は変換し、それ以外は無変換で戻します。
(3) vbFromUnicode は、変換後、実行します。

まずは、シフトJIS に変換可能な文字かどうかを判別する、拡張メソッドを作ります。

文字コードを調べる方法もありますが、範囲を調べるのが面倒なのと、漏れがあったら怖いので、WideCharToMultiByte API を使ってしまうことにします。

 public const int
     CP_932 = 932,
     WC_NO_BEST_FIT_CHARS = 0x00000400;
 
 [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
 private static extern int WideCharToMultiByte(
                    int CodePage,
                    int dwFlags,
                    ref char lpWideChar,
                    int cchWideChar,
                    byte[] lpMultibyteStr,
                    int cchMultibyte,
                    ref char lpDefaultChar,
                    out bool lpUsedDefaultChar);
 
 public static bool IsShiftJis(this char value)
 {
     byte[] buffer = new byte[4];
     char defaultChar = char.MinValue;
     bool useDefaultChar;
     int result = WideCharToMultiByte(
                     CP_932,
                     WC_NO_BEST_FIT_CHARS,
                     ref value,
                     1,
                     buffer,
                     buffer.Length,
                     ref defaultChar,
                     out useDefaultChar
                     );
 
     return !useDefaultChar;
 }



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   最終更新のRSS
Last-modified: 2013-09-08 (日) 02:39:03 (1505d)