文字列を一文字ずつチェックして、いわゆる「ダメ文字」が含まれていないかどうか調べる。 文字列中の文字を1文字ずつバイト表現に変換し、変換した2バイト目以降をチェックして、0x5c(バックスラッシュ記号)なら「ソ系」ダメ文字、0x7c(パイプ記号)なら「ポ系」ダメ文字と判断する。
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
実行結果
ソフトウェア → 'ソ'はダメ文字です シンポジウム → 'ポ'はダメ文字です 六十年 → '十'はダメ文字です 竹取物語 → '竹'はダメ文字です ダメ文字 → ダメ文字は含まれていません