Stringオブジェクトの文字列中に制御文字(0x00~0x19)が入ると、TextBoxなどに値を表示する際、制御文字が入っている事を確認する事が出来ません。
このような場合、制御文字を他のテキスト文字に置き換えると分かりやすいです。
という訳で今回は、制御文字を可視化(例えば0x02を[STX]に置き換えるなど)させるコードを紹介します。
変換作業は、正規表現による置換機能を利用します。正規表現を使って制御文字をマッチさせたいのですが、幸いな事に.Netでは、制御文字は「\p{Cc}」というパターンであらわす事が可能です。
「\p{Cc}」って何???と思われるかもしれませんが、分解して考えると以下の形になります。
\p{name} nameで指定されたUnicode一般カテゴリまたは名前付きブロック内の任意の1文字と一致 Cc Unicodeで定義されているGeneral Categoryの一種で,制御文字を意味する |
入門 正規表現
という訳で、制御コードを可視化するには下記のコードになります。
1.制御コードが含まれる文字列を、コード名称に変換する。
string inData = "data\r\n"; string[] ctrlStr = { "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL", "BS", "HT", "LF", "VT", "NP", "CR", "SO", "SI", "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", "CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US" }; outStr = Regex.Replace( inStr, @"\p{Cc}", str=> { int offset = str.Value[0]; if ( ctrlStr.Length > offset ) { return "[" + ctrlStr[ offset ] + "]"; } else { return string.Format("<{0:X2}>", (byte)str.Value[0]); } }); //outStr -> "data[CR][LF]" |
2.制御コードが含まれる文字列を、16進文字列に変換する。
string inData = "data\r\n"; outStr = Regex.Replace( inData, @"\p{Cc}", str=>string.Format("[{0:X2}]", (byte)str.Value[0]) ); //outStr -> "data[0D][0A]" |
後者は分かりやすいですが、前者はちょっと見づらくなってしまいました。
前者例のパターンで制御文字の前後に付与する文字(例だと”[“,”]”)が決まっている場合は、ctrlStr配列へ直に書いた方がパフォーマンスが良いです。

反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)
関連記事
コメントを残す