TAB を 空白に変換

TAB を 空白に変換

TAB文字は、4文字分の幅にするのが、一般的だと思うが、
ブラウザで表示した場合、8文字分の幅で表示されてしまう。

そこで、TAB文字を、4文字分になるよう変換する機能を追加する。

1文字づつ読むたびに、その文字の文字幅をcolに加算して行き、
TABが出現したら、colが4で割り切れる数になるまで空白を出力する。


//*********************************************************************
// HTML に書式化して出力
//*********************************************************************
private const char NEWLINE = '\n';
private const char TAB = '\t';
private const char BLANK = ' ';

public void tohtml(Reader reader, Writer writer)
{
int col = 0; //現在位置を保持

//ファイルの終わりまで、1文字ずつ読んで
char c;
while((c = reader.getChar()) != EOF)
{
if (c == TAB) //TAB文字なら
{
//TAB位置まで空白で埋める
string s = "";
do
{
s += BLANK; //空白を追加
} while (!TabPos(++col)); //TAB位置まで進んだら抜ける
writer.putString(s); //空白を出力
}
else if (c == NEWLINE) //改行コードなら
{
col = 0; //現在位置をクリア
writer.putChar(c); //読んだ文字をそのまま出力
}
else //TABでも 改行コードでも なければ
{
col += getLength(c); //現在位置を文字幅だけ進める
writer.putString(getHtmlChar(c));//"<",">","&" を変換して出力
}
}
}
//現在位置が、TAB 位置かどうかを返す
private bool TabPos(int col)
{
return ((col % 4) == 0);
}
//取得した文字のByte数を返す
private int getLength(char c)
{
System.Text.Encoding sjis = System.Text.Encoding.GetEncoding("shift-jis");
return sjis.GetByteCount(c.ToString());
}