我已尝试过此链接: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: ?
我已经阅读了一些关于必须修改自动生成的字符串流文件的内容,但我真的不明白。
答案 0 :(得分: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也可以被使用不同编码的PrintStream替换:
System.setOut(new PrintStream(System.out, true, "UTF-8"));
上述任何一种都会强制以指定的编码生成输出。但是,在控制台上显示结果时,重要的是要了解shell使用的编码。我的Windows默认为Cp850,可以使用chcp
命令修改编码。上面的println将使用Java中的“Windows-1252”和chcp 1250
生成正确的图形。