HTML内の ISO-8859-1 文字

HTMLで、特殊?な文字の扱いをほっといたのを忘れてた。なので、  やらを使っていると、検索結果のサマリ (最近は snippet というのかな) でまんま表示される。簡単な方法だったら、とりあえず思いついたけど、色々調べると、文字定義って沢山あるんだねぇ。
次のURLの内容を参考にして考えた。

ISO 8859-1 (Latin-1) Character Set ( http://www.asahi-net.or.jp/~CI5M-NMR/w3/latin1.html )

日本で使ってる分には、これらの文字はほとんど使われない。。。なので、速度の低下要因の方の比重が大きいけど、いつかはちゃんとサポートすべきなのかもしれない。それに、ブラウザのリクエストとのネットワーク上のやりとりも含めて考えると無視できる速度かもしれん。

簡易方法で考えたのは次のような方法だったが、その後、先ほどのURLを確認して思案。

  private static final Pattern UNESCAPE_HTML_PATTERN =
    Pattern.compile("&((#[0-9]{2,3})|(nbsp)|(lt)|(gt)|(quot)|(amp));");

  private String unescapeHtmlText(String src) {
    StringBuffer buff = new StringBuffer();
    Matcher matcher = UNESCAPE_HTML_PATTERN.matcher(src);
    int prevPos = 0;
    while (matcher.find(prevPos)) {
      buff.append(src.substring(prevPos, matcher.start()));
      String matchedText = matcher.group(1);
      char firstChar = matchedText.charAt(0);
      int charNum;
            
      switch (firstChar) {
      case 'n': // nbsp
        buff.append(" ");
        break;
      case 'l': // lt
        buff.append("<");
        break;
      case 'g': // gt
        buff.append(">");
        break;
      case 'q': // quot
        buff.append("\"");
        break;
      case 'a': // amp
        buff.append("&");
        break;
      case '#': // numbers.
        charNum = Integer.parseInt(matchedText.substring(1));
        if (0x0a <= charNum && charNum <= 0xff) {
          buff.append((char)charNum);
        } else {
          buff.append(matcher.group()); // some wrong case like &#555;
        }
        break;
      default: // normally, never come.
        buff.append(matcher.group());
        break;
      }
            
      prevPos = matcher.end();
    }
    if (prevPos < src.length())
      buff.append(src.substring(prevPos));
        
    return new String(buff);
  }

結論: 上のコードは没。気が付いちゃったし、やり方も、ちょっと訂正すればなんとかなりそうなので、Named Entry というやつにも対応することにしよう。