0

私はすでにこのリンクを試しました: Print in JavaCC。しかし、なんらかの理由で、その答えはうまくいきませんでした。テキストをコピーしてファイルに貼り付けて実行しましたが、µたとえば と入力しても何も出力されませんでした。

文字列トークンで非英語を使用できるようにしたいと考えています。テスト目的のためだけに、現在私は持っています:

options 
{
    UNICODE_INPUT = true;
    JAVA_UNICODE_ESCAPE = false;
}

PARSER_BEGIN(Unicode)

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

public class Unicode
{
    public static void main(String[] args)
    {
        if(args.length == 0)
        {
            System.out.println("File name not specified!");
            return;
        }

        System.out.println("-----Start-----\n\n");
        try
        {
            FileInputStream fis = new FileInputStream(args[0]);
            InputStreamReader isr = new InputStreamReader(fis, "UTF8");

            Unicode parser = new Unicode(isr);
            parser.start();
        }
        catch(FileNotFoundException ex){
            System.out.println(ex);
        }
        catch(UnsupportedEncodingException ex){
            System.out.println(ex);
        }
        catch(ParseException ex){
            System.out.println(ex);
        }
        catch(TokenMgrError ex){
            System.out.println(ex);
        }
        System.out.println("\n\n------End-------");
    }
}

PARSER_END(Unicode)

TOKEN:{
    //         á          é          í          ó          ú
    <STR: ("\u00e1" | "\u00e9" | "\u00ed" | "\u00f3" | "\u00fa")>
}

void start():
{
    Token found;
}
{
    (
        found = <STR>
        {System.out.println("Input: " + found.image);}
    )+

    <EOF>
}

パーサーを実行して を含むファイルをフィードするとá, é, í, ó, ú、たくさんの疑問符しか表示されません。

Input: ?
Input: ?
Input: ?
Input: ?
Input: ?

自動生成される char ストリーム ファイルを変更する必要があると読んだことがありますが、よくわかりません。

4

1 に答える 1

1

これは、Java PrintStream に使用されるデフォルトのエンコーディングと、標準出力に影響するコマンド シェルの設定との間のエンコーディングの問題です。

InputStream エンコーディングが明示的に指定されており、入力が正常に解析されているように見えるため、問題は JavaCC とは関係ありません。したがって、これでも再現できるはずです。

  System.out.println("\u00e1\u00e9\u00ed\u00f3\u00fa");

System.out PrintStream で使用されるエンコーディングは、システム プロパティ "file.encoding" から取得されます。これは、私の Windows システムではデフォルトで "Cp1252" (つまり、Windows-1252) です。「file.encoding」を設定することで、別のものを使用するように強制できます。

  java -dfile.encoding=UTF-8 Unicode

また、標準の PrintStream を別のエンコーディングを使用するものに置き換えることもできます。

  System.setOut(new PrintStream(System.out, true, "UTF-8"));

上記のいずれも、出力が指定されたエンコーディングで生成されるように強制します。ただし、結果をコンソールに表示する場合は、シェルで使用されるエンコーディングを理解することが重要です。私の Windows のデフォルトは Cp850 で、chcpコマンドを使用してエンコードを変更できます。上記の println は、Java の「Windows-1252」とchcp 1250.

于 2012-08-12T11:56:11.497 に答える