- PR -

HTMLEditorKit.ParserCallback.handleTextで特殊文字をパースした時の戻り値について

1
投稿者投稿内容
johny
会議室デビュー日: 2004/08/18
投稿数: 1
投稿日時: 2004-08-18 18:09
初めまして、ジョンと申します。

ParserDelegatorを使って、HTML内のテキストだけを抽出するプログラムを書いているのですが、特殊文字のが上手く抽出できません。特に が問題で、何時ものように?になってしまいます。

下記のアプリケーションを実行すると

出力:?<?こんにちは?>?

となってしまいます。期待している出力は

期待する出力:&nbsp;&lt;&nbsp;こんにちは&nbsp;&gt;&nbsp;

です。

HTMLストリームをParserDelegatorへ渡した時点で特殊文字はUnicodeに直されているようで、特殊文字は&lt;=“<”のように変換されてしまっています。

今のところUnicodeを特殊文字に戻すクラス(下記:SpecialCharacterTable)で強引に元に戻しているのですが、丸文字やユーロ記号のように比較的最近追加された特殊文字等があると、やはり?が出力されてしまうの、未だに戦々恐々としています。

出来れば、ByteArrayOutputStreamを直接ParserDelegator().parse()に渡して、handleTextの戻り値としてchar[]ではなくbyte[]で受け取りたいのですが、何か良い方法はないものでしょうか?

もし似たような御経験がある方がいらっしゃれば是非ご教授をお願いいたします。

*** handleText()の実装とストリームの入力 ***

コード:

import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.parser.ParserDelegator;

class TextParser extends HTMLEditorKit.ParserCallback {

    protected StringBuffer sb = new StringBuffer(256); 

    public void handleText(char[] data, int pos){
        sb.append(data);
    }
    
    public static void main(String[] args) {
        try{
            Reader in = new StringReader("<p>&nbsp;&lt;&nbsp;こんにちは&nbsp;&gt;&nbsp;</p>");
            TextParser t = new TextParser();
            new ParserDelegator().parse(in, t, false);
            
            System.out.println(t.sb.toString());
            
            in.close();
        }catch(IOException e){
            e.printStackTrace();
        }
    } 
}



*** 特殊文字変換の為のクラス ***

コード:

public class SpecialCharacterTable {

    public SpecialCharacter[] SpecialCharacterTable = {
            new SpecialCharacter(  1, "&quot;" , '\u0022' ,"quotation" ),
            new SpecialCharacter(  2, "&amp;" , '\u0026' ,"ampersand" ),
            new SpecialCharacter(  3, "&lt;" , '\u003c' ,"less-than" ),
            new SpecialCharacter(  4, "&gt;" , '\u003e' ,"greater-than" ),
            new SpecialCharacter(  5, "&nbsp;" , '\u00a0' ,"no-break space" ),
            //途中省略
            new SpecialCharacter( 10, "&yen;" , '\u00a5' ,"Japanese Yen" ),
            //途中省略
            new SpecialCharacter(252, "&euro;" , '\u20ac' ,"Euro" )
    };
    
    
    public class SpecialCharacter{
        
        int index;
        String expression;
        char hexadecimal;
        String comment;
        
        public SpecialCharacter(int index , String expression , char hexadecimal , String comment){
            this.index = index;
            this.expression = expression;
            this.hexadecimal = hexadecimal;
            this.comment = comment;
        }
        

    }
    
    public String fromUnicodeToExpression(char[] c){
        StringBuffer sb = new StringBuffer();
        //Boolean isSpecialCharacter = false;
        String exp = "";
        for(int i=0 ; i<c.length ; i++){
            for(int j=0 ; j<SpecialCharacterTable.length ; j++){
                if( c[i] == SpecialCharacterTable[j].hexadecimal ) {
                    exp = SpecialCharacterTable[j].expression;
                    System.out.println("Hello:"+exp);
                }
            }
            
            if(exp == ""){
                sb.append(c[i]);
            }else{
                sb.append(exp);
            }
            exp = "";
        }
        
        return sb.toString();
    }

}



※本文とコードの中の\(バックスラッシュ)と&はこのBBの表示の都合で全角に治したあります。本来は半角の¥と&です。
1

スキルアップ/キャリアアップ(JOB@IT)