ダメ文字を含むかどうかチェックする 最終更新日 2011年8月31日 0:23 文字列を一文字ずつチェックして、いわゆる「ダメ文字」が含まれていないかどうか調べる。 文字列中の文字を1文字ずつバイト表現に変換し、変換した2バイト目以降をチェックして、0x5c(バックスラッシュ記号)なら「ソ系」ダメ文字、0x7c(パイプ記号)なら「ポ系」ダメ文字と判断する。 C# VB 別ウィンドウで開く すべて選択してコピー ダウンロード 行番号を表示する using System; using System.Text; class Sample { static void Main() { // Shift-JISに変換した場合にダメ文字が含まれるかチェックする var shiftjis = Encoding.GetEncoding(932); foreach (var str in new[] { // テストする文字列 "ソフトウェア", "シンポジウム", "六十年", "竹取物語", "ダメ文字" }) { Console.Write("{0} → ", str); // 文字列中のダメ文字のインデックスを取得する var posNGChar = IndexOfShellSpecialChar(str, shiftjis); if (posNGChar == -1) Console.WriteLine("ダメ文字は含まれていません"); else Console.WriteLine("'{0}'はダメ文字です", str[posNGChar]); } } private static int IndexOfShellSpecialChar(string text, Encoding encoding) { var chars = text.ToCharArray(); // 文字列をchar配列に変換 var buffer = new byte[4]; // 任意の1文字のバイト表現を格納するバッファ var encoder = encoding.GetEncoder(); encoder.Reset(); // 1文字ずつチェックする for (var index = 0; index < chars.Length; index++) { // 1文字をエンコードしてバイト列を取得する var len = encoder.GetBytes(chars, index, 1, buffer, 0, false); // エンコードした文字の2バイト目以降をチェックする for (var i = 1; i < len; i++) { if (buffer[i] == 0x5c) // バックスラッシュ 0x5cの場合 (「ソ系」ダメ文字) return index; else if (buffer[i] == 0x7c) // パイプ 0x7cの場合 (「ポ系」ダメ文字) return index; } } return -1; // ダメ文字は含まれていない } } 別ウィンドウで開く すべて選択してコピー ダウンロード 行番号を表示する Imports System Imports System.Text Class Sample Shared Sub Main() ' Shift-JISに変換した場合にダメ文字が含まれるかチェックする Dim shiftjis As Encoding = Encoding.GetEncoding(932) For Each str As String In New String() { _ "ソフトウェア", _ "シンポジウム", _ "六十年", _ "竹取物語", _ "ダメ文字" _ } Console.Write("{0} → ", str) ' 文字列中のダメ文字のインデックスを取得する Dim posNGChar As Integer = IndexOfShellSpecialChar(str, shiftjis) If posNGChar = -1 Then Console.WriteLine("ダメ文字は含まれていません") Else Console.WriteLine("'{0}'はダメ文字です", str(posNGChar)) End If Next End Sub Private Shared Function IndexOfShellSpecialChar(ByVal text As String, ByVal encoding As Encoding) As Integer Dim chars As Char() = text.ToCharArray() ' 文字列をchar配列に変換 Dim buffer(3) As Byte ' 任意の1文字のバイト表現を格納するバッファ Dim encoder As Encoder = encoding.GetEncoder() encoder.Reset() ' 1文字ずつチェックする For index As Integer = 0 To chars.Length - 1 ' 1文字をエンコードしてバイト列を取得する Dim len As Integer = encoder.GetBytes(chars, index, 1, buffer, 0, False) ' エンコードした文字の2バイト目以降をチェックする For i As Integer = 1 To len - 1 If buffer(i) = &h5C Then ' バックスラッシュ &h5Cの場合 (「ソ系」ダメ文字) Return index Else If buffer(i) = &h7C Then ' パイプ 0x7cの場合 (「ポ系」ダメ文字) Return index End If Next Next Return -1 ' ダメ文字は含まれていない End Function End Class 実行結果 ソフトウェア → 'ソ'はダメ文字です シンポジウム → 'ポ'はダメ文字です 六十年 → '十'はダメ文字です 竹取物語 → '竹'はダメ文字です ダメ文字 → ダメ文字は含まれていません