【问题标题】:Non-English Tokens in JavaCCJavaCC 中的非英语标记
【发布时间】:2012-08-11 03:51:29
【问题描述】:

我已经尝试过这个链接: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: ?

我读过一些关于必须修改自动生成的字符流文件的内容,但我不太明白。

【问题讨论】:

    标签: string unicode utf-8 javacc


    【解决方案1】:

    这是用于 Java PrintStream 的默认编码与命令 shell 中影响标准输出的设置之间的编码问题。

    由于明确指定了 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"));
    

    以上任何一种都将强制以指定的编码生成输出。但是,当在控制台上显示结果时,重要的是要了解 shell 使用什么编码。我的Windows默认为Cp850,可以使用chcp命令修改编码。上面的 println 将使用 Java 中的“Windows-1252”和chcp 1250 生成正确的图形。

    【讨论】:

    • 所以,本质上我必须确保一切都使用 UTF-8,例如 System.in、System.out 和我正在使用的 shell。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    • 1970-01-01
    • 2017-07-29
    相关资源
    最近更新 更多