連載
» 2004年12月10日 05時00分 公開

.NET TIPS:文字列やテキストをHTMLエンコードするには?

[遠藤孝信,デジタルアドバンテージ]
.NET TIPS
Insider.NET


「.NET TIPS」のインデックス

連載目次

 文字列やテキストをHTMLとしてブラウザで表示するような場合、例えば文字列に不等号(「<」や「>」)が含まれていると、その文字がHTMLのタグを記述するための不等号と区別できずに誤って解釈される可能性がある。このような場合には、あらかじめ文字列中の不等号を「&gt;」や「&lt;」で置き換えておくことにより、HTMLとして正しく表示させることができる。

 このような変換は「HTMLエンコード」と呼ばれるが、.NET Frameworkのクラス・ライブラリでは、HttpUtilityクラス(System.Web名前空間)のHtmlEncodeメソッドにより文字列をHTMLエンコードすることが可能だ。

 HtmlEncodeメソッドは、パラメータとして文字列を受け取り、HTMLエンコードされた文字列を返す。このメソッドで置き換えられる文字の一覧を次の表にまとめた。

変換前の文字 変換後の文字列 備考
" &quot; quotはquotationの略
& &amp; ampはampersandの略
< &lt; ltは「less than」の略
> &gt; 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(" ", "&nbsp;") + "<br>";
      Console.WriteLine(html);
    }
    sr.Close();
  }
}

// コンパイル方法:csc text2html.cs

テキスト・ファイルをHTMLに変換するC#のサンプル・プログラム(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(" ", "&nbsp;") + "<br>"
      Console.WriteLine(html)
      line = sr.ReadLine()
    End While
    sr.Close()
  End Sub
End Class

' コンパイル方法:vbc /r:System.Web.dll text2html.vb

テキスト・ファイルをHTMLに変換するVB.NETのサンプル・プログラム(text2html.vb)
text2html.vbのダウンロード

 このプログラムでは、コマンドラインのパラメータで指定されたファイルを1行ずつ読み込みながら、HTMLエンコードを行い、タブ文字を空白文字(半角スペース)に展開し(ExpandTabsメソッド)、さらに空白文字を「&nbsp;」に置き換え、行末に「<br>」を追加して出力する。

 ブラウザでは、行頭の空白文字は表示されず、また連続する空白文字は1つの空白文字で表示されてしまうため、空白文字をそのまま表示するには、それを「&nbsp;」(nbspはNon-breaking Spaceの略)で置き換える必要がある。

 例えば、指定したテキスト・ファイルに次のような行が含まれていると、

html = html.Replace(" ", "&nbsp;") + "<br>";


このプログラムではこれを以下のように変換する。

html&nbsp;=&nbsp;html.Replace(&quot;&nbsp;&quot;,&nbsp;&quot;&amp;nbsp;&quot;)&nbsp;+&nbsp;&quot;&lt;br&gt;&quot;;


 なお、サンプル・プログラムで用いている半角/全角文字のチェック(IsZenkakuメソッド)については「TIPS:文字列の全角/半角をチェックするには?」を、StreamReaderクラスによるテキスト・ファイルの読み込みについては「テキスト・ファイルの内容を読み込むには?」を参照していただきたい。

カテゴリ:クラス・ライブラリ 処理対象:文字列
使用ライブラリ:HttpUtilityクラス(System.Web名前空間)
関連TIPS:文字列の全角/半角をチェックするには?
関連TIPS:テキスト・ファイルの内容を読み込むには?


「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。