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