带有ß字符的Java编译问题

时间:2014-07-28 18:37:31

标签: java non-ascii-characters

我遇到了一个奇怪的问题。在下面的代码中,我正在寻找ß的存在。

public static void main(String[] args) {
    char [] chArray = {'ß'};
    String str = "Testß";
    for(int i=0; i<chArray.length; i++){
        if(str.indexOf(chArray[i])>-1){
            System.out.println("ß is present");
            break;
        }
    }

}

我在Linux上的JBOSS上运行了一个Web应用程序,Java 6. 当在上面指定的应用程序中包含代码时,上面的代码没有检测到ß的存在。 令人惊讶的是,如果我在我的eclipse工作区中编译相同的文件,然后在应用程序中应用补丁,它将按预期运行!

注意事项:

  1. 应用程序构建环境对我来说是一个黑盒子,因此不知道javac命令是否存在任何-encoding选项或类似的东西
  2. 我的eclipse的JRE是java8,但为该项目设置的编译器版本是Java6
  3. 我在数组声明中将值从ß更改为等效于\ u00DF的unicode,但行为仍然相同。

    char [] chArray = {'\ u00DF'};

  4. 当我反编译生成的类文件时,字符数组声明的值显示为65533,即\ uFFFD,只有用于未识别符号的替换字符。我使用JD-GUI作为反编译器,我认为不值得信赖!

  5. 需要你的帮助人员!我确信它不同于:Java's equalsIgnoreCase fails with ß ("Sharp S" used in German alphabet)

    的区分大小写的问题

    提前致谢

2 个答案:

答案 0 :(得分:3)

我认为你的问题是ß的编码。您有两种方法可以解决错误:

  1. 首先将您的java源代码转换为ascii字符,然后编译它:

    native2ascii "your_class_file.java"
    javac "your_class_file.java"
    
  2. 使用您的编码编译您的java文件,在Linux上编译utf-8,在Windows上编译iso-8859-15

    javac -encoding "encoding" "your_class_file.java"
    
  3. 据我所知,它可以用"ß"取代"\u00df"。如果上述解决方案不起作用,请将每个char及其unicode值打印到System.out,并查看哪个char是'ß'。

    另一个错误可能是您在不支持ß的编码中读取文本;尝试通过读取字节来读取字符串并调用:

    String input = new String(input_bytes, StandartCharsets.UTF_8); // on linux
    String input = new String(input_bytes, StandartCharsets.ISO_8859_1); // on windows
    

    有关字符集的更多信息,请参阅StandartCharsets class reference

答案 1 :(得分:1)

感谢您的时间和回复!

实际问题是在构建中没有生成类文件,因此更改没有反映出来。在java源文件中使用ß的unicode值\ u00DF应该可以正常工作。