【问题标题】:JavaParser exception 'Lexical error' raised when a file containing German umlauts (äöüß) is parsed解析包含德语变音符号 (äöüß) 的文件时引发 JavaParser 异常“词法错误”
【发布时间】:2012-03-20 07:08:32
【问题描述】:

我正在使用最新的 JavaParser 解析大量 .java 文件。

文件解析如下:

in = new FileInputStream(file);
cu = JavaParser.parse(in);

只要其中一个源文件包含德语变音符号 (ä,ö,ü,ß),就会引发以下异常(它们仅出现在 .java 文件的 cmets 中)

线程“main”中的异常 japa.parser.TokenMgrError:第 82 行第 17 列出现词法错误。遇到:“\ufffd”(65533),之后:“”

我能做些什么来解决这个问题。我无法更改所有源文件。

【问题讨论】:

    标签: java utf-8 character-encoding diacritics


    【解决方案1】:

    您可能只需要指定正确的编码:

    cu = JavaParser.parse(in, "utf-8");
    

    ...或者你的实际编码是什么。

    【讨论】:

    • 遗憾的是,这并不能解决问题。 UltraEdit 将编码显示为 UNIX。
    • @Hedge 如果它没有在工具栏中显示 UNIX-UTF8(或者可能是 UTF8-UNIX,我使用 UltraEdit 已经有一段时间了)作为编码,它很可能以 iso-8859-1 编码或 iso-8859-15。
    • @Hedge:你从哪里得到源代码的?没有像“UNIX”这样的编码 - 这可能只是表示真正的行尾。
    • 我尝试了 io 和 nio-API。他们没有工作。它可能只是常规的 ASCII 码。源代码直接来自我公司的版本控制系统。它是 ClearCase,但我不能告诉你它在什么样的机器上运行。可以是 UNIX 或 z/OS。
    • @Hedge:如果它包含变音符号,那肯定不是 ASCII……你应该问问你的同事或系统管理员正在使用哪种编码。
    【解决方案2】:

    JavaParser.parse() 上有一个需要编码的重载。根据你的文件编码,试试这个;

    cu = JavaParser.parse(in, "ISO8859_1");
    

    或者这个

    cu = JavaParser.parse(in, "UTF8");
    

    列出了所有支持的编码here

    【讨论】:

    • 两种编码都无法解决我的问题。
    • @Hedge 它是否给出相同或另一个错误消息?有点难以猜测使用的是什么编码,但如果 JavaParser 使用 NIO,则可能需要改为 ISO-8859-1。如果这不起作用,请尝试将 UltraEdit 切换到十六进制模式并发布一个或几个字母是如何以十六进制编码的。这将使找到正确的编码变得相当容易。
    • 我试过 UTF8、UTF-8、ISO-8859-1 和 SO8859_1。 'ü' 的十六进制数是 FC
    • @Hedge 肯定是 iso-8859-1 或 iso-8859-15 编码(如果我没记错的话,它们只会在 € 符号上有所不同)现在,如果 Java 有编码名称的常量而不是字符串,那么你每次都要弄清楚,这很容易......
    • 你是对的,两种编码都有效。我的问题是我忘记了 parse-command 在四个不同的位置执行 facepalm
    猜你喜欢
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多