散々お世話になった、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;
}