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 ȫ
}
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 というやつにも対応することにしよう。