5

問題: Unicode 文字を正しく印刷できません。

これが私の文法です:

options { k=1; filter=true;
 // Allow any char but \uFFFF (16 bit -1)
charVocabulary='\u0000'..'\uFFFE'; 
}

ANYCHAR :'$'
|    '_' { System.out.println("Found underscore: "+getText()); }
|    'a'..'z' { System.out.println("Found alpha: "+getText()); }
|    '\u0080'..'\ufffe' { System.out.println("Found unicode: "+getText()); }
; 

レクサーを呼び出す main メソッドのコード スニペット:

public static void main(String[] args) {
SimpleLexer simpleLexer = new SimpleLexer(System.in);
while(true) {
try {
Token t = simpleLexer.nextToken();
System.out.println("Token : "+t);

} catch(Exception e) {}

}
}

入力"ठ"の場合、次の出力が得られます。

Found unicode: 
Token : ["à",<5>,line=1,col=7]
Found unicode: 
Token : ["¤",<5>,line=1,col=8]
Found unicode:  
Token : [" ",<5>,line=1,col=9]

lexer は Unicode char "ठ" を 3 つの別個の文字として扱っているようです。私の目標は、「ठ」をスキャンして印刷することです。

4

1 に答える 1

6

問題はANTLRで生成されたレクサーではなく、それに渡すJavaストリームにあります。ストリームはバイトのみを読み取り (エンコーディングでは解釈しません)、表示されるのは UTF-8 シーケンスです。

ANTLR 3 の場合は、パラメーターとしてアンコーディングを受け取る ANTLRInputStreamコンストラクターを使用できます。

ANTLRInputStream (InputStream input, String encoding) throws IOException
于 2010-09-02T22:20:54.113 に答える