文字列やテキストをHTMLとしてブラウザで表示するような場合、例えば文字列に不等号(「<」や「>」)が含まれていると、その文字がHTMLのタグを記述するための不等号と区別できずに誤って解釈される可能性がある。このような場合には、あらかじめ文字列中の不等号を「>」や「<」で置き換えておくことにより、HTMLとして正しく表示させることができる。
このような変換は「HTMLエンコード」と呼ばれるが、.NET Frameworkのクラス・ライブラリでは、HttpUtilityクラス(System.Web名前空間)のHtmlEncodeメソッドにより文字列をHTMLエンコードすることが可能だ。
HtmlEncodeメソッドは、パラメータとして文字列を受け取り、HTMLエンコードされた文字列を返す。このメソッドで置き換えられる文字の一覧を次の表にまとめた。
変換前の文字 | 変換後の文字列 | 備考 |
---|---|---|
" | " | quotはquotationの略 |
& | & | ampはampersandの略 |
< | < | ltは「less than」の略 |
> | > | gtは「greater than」の略 |
文字コードが0x0A〜0xFFの文字 | &#文字コード; | ラテン1補助(Latin-1 Supplement)と呼ばれるUnicode文字の領域。変換後の文字列内の文字コードは10進数表記 |
HttpUtilityクラスのHtmlEncodeメソッドで変換される文字の一覧 |
テキスト・ファイルをHTMLに変換するサンプル・プログラム
次のサンプル・プログラムは、HtmlEncodeメソッドを利用してテキスト・ファイル(シフトJISのファイル)の内容をHTMLに変換する。
// text2html.cs
using System;
using System.IO;
using System.Web;
using System.Text;
public class TextToHtml {
const int TabSize = 4;
static Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS");
static bool IsZenkaku(char c) {
return sjisEnc.GetByteCount(new char[] {c}) == 2;
}
static string ExpandTabs(string s) {
int column = 0;
StringBuilder sb = new StringBuilder();
foreach (char c in s) {
if (c == '\t') {
sb.Append(' ', TabSize - (column % TabSize));
column = 0;
} else {
sb.Append(c);
column++;
if (IsZenkaku(c)) column++;
}
}
return sb.ToString();
}
static void Main(string[] args) {
string line;
StreamReader sr = new StreamReader(args[0], sjisEnc);
while ((line = sr.ReadLine()) != null) {
string html = HttpUtility.HtmlEncode(line);
html = ExpandTabs(html);
html = html.Replace(" ", " ") + "<br>";
Console.WriteLine(html);
}
sr.Close();
}
}
// コンパイル方法:csc text2html.cs
text2html.csのダウンロード
' text2html.vb
Imports System
Imports System.IO
Imports System.Web
Imports System.Text
Imports Microsoft.VisualBasic
Public Class TextToHtml
Const TabSize As Integer = 4
Shared sjisEnc As Encoding = Encoding.GetEncoding("Shift_JIS")
Shared Function IsZenkaku(c As Char) As Boolean
Return sjisEnc.GetByteCount(New Char() {c}) = 2
End Function
Shared Function ExpandTabs(ByVal s As String) As String
Dim column As Integer = 0
Dim sb As StringBuilder = New StringBuilder()
Dim c As Char
For Each c In s
If c = ControlChars.Tab Then
sb.Append(" ", TabSize - (column Mod TabSize))
column = 0
Else
sb.Append(c)
column += 1
If IsZenkaku(c) Then column += 1
End If
Next
Return sb.ToString()
End Function
Shared Sub Main(ByVal args() As String)
Dim line As String
Dim sr As StreamReader = New StreamReader(args(0),sjisEnc)
line = sr.ReadLine()
While Not line Is Nothing
Dim html As String = HttpUtility.HtmlEncode(line)
html = ExpandTabs(html)
html = html.Replace(" ", " ") + "<br>"
Console.WriteLine(html)
line = sr.ReadLine()
End While
sr.Close()
End Sub
End Class
' コンパイル方法:vbc /r:System.Web.dll text2html.vb
text2html.vbのダウンロード
このプログラムでは、コマンドラインのパラメータで指定されたファイルを1行ずつ読み込みながら、HTMLエンコードを行い、タブ文字を空白文字(半角スペース)に展開し(ExpandTabsメソッド)、さらに空白文字を「 」に置き換え、行末に「<br>」を追加して出力する。
ブラウザでは、行頭の空白文字は表示されず、また連続する空白文字は1つの空白文字で表示されてしまうため、空白文字をそのまま表示するには、それを「 」(nbspはNon-breaking Spaceの略)で置き換える必要がある。
例えば、指定したテキスト・ファイルに次のような行が含まれていると、
html = html.Replace(" ", " ") + "<br>";
このプログラムではこれを以下のように変換する。
html = html.Replace(" ", "&nbsp;") + "<br>";
なお、サンプル・プログラムで用いている半角/全角文字のチェック(IsZenkakuメソッド)については「TIPS:文字列の全角/半角をチェックするには?」を、StreamReaderクラスによるテキスト・ファイルの読み込みについては「テキスト・ファイルの内容を読み込むには?」を参照していただきたい。
カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:HttpUtilityクラス(System.Web名前空間)
関連TIPS:文字列の全角/半角をチェックするには?
関連TIPS:テキスト・ファイルの内容を読み込むには?
■この記事と関連性の高い別の.NET TIPS
- 文字列をURLエンコードするには?
- 文字列の全角/半角をチェックするには?
- 文字列の長さを取得するには?
- 文字と文字列を変換するには?
- [ASP.NET]DataGridコントロールで特定の行や文字を強調するには?
Copyright© Digital Advantage Corp. All Rights Reserved.