文字列を一文字ずつチェックして、いわゆる「ダメ文字」が含まれていないかどうか調べる。 文字列をバイト表現に変換し、2バイト目以降に0x5c(バックスラッシュ記号)を含む「ソ系」ダメ文字、または0x7c(パイプ記号)を含む「ポ系」ダメ文字かどうか判断する。
static bool ContainsNGByte(string text, Encoding encoding) { for (int index = 0; index < text.Length; index++) { string chr = text.Substring(index, 1); byte[] bytes = encoding.GetBytes(chr); for (int i = 1; i < bytes.Length; i++) { // 「ソ系」ダメ文字(バックスラッシュ0x5cを含む)かどうか if (bytes[i] == 0x5c) { Console.WriteLine("{0}は「ソ系」ダメ文字です", chr); return true; } // 「ポ系」ダメ文字(パイプ0x7cを含む)かどうか if (bytes[i] == 0x7c) { Console.WriteLine("{0}は「ポ系」ダメ文字です", chr); return true; } } } return false; }
static void Main(string[] args) { foreach (string str in new string[] { "ソフトウェア", "シンポジウム", "六十年", "竹取物語", "ダメ文字" }) { Console.WriteLine("チェック対象: {0}", str); // Shift-JISの文字列としてチェックする if (ContainsNGByte(str, Encoding.GetEncoding(932))) { Console.WriteLine(" ダメ文字が含まれています"); } else { Console.WriteLine(" ダメ文字は含まれていません"); } Console.WriteLine(); } }
チェック対象: ソフトウェア ソは「ソ系」ダメ文字です ダメ文字が含まれています チェック対象: シンポジウム ポは「ポ系」ダメ文字です ダメ文字が含まれています チェック対象: 六十年 十は「ソ系」ダメ文字です ダメ文字が含まれています チェック対象: 竹取物語 竹は「ポ系」ダメ文字です ダメ文字が含まれています チェック対象: ダメ文字 ダメ文字は含まれていません