[C#]文字列中の制御文字を、[CR][LF]や[0D][0A]のように可視化する

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配列へ直に書いた方がパフォーマンスが良いです。



4774145092
反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)

関連記事

コメントを残す

メールアドレスが公開されることはありません。