Проблема с компиляцией Java с ß-символом

Я столкнулся с какой-то странной проблемой. В нижеприведенном фрагменте кода я ищу присутствие ß.

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;
        }
    }

}

У меня есть веб-приложение, работающее на JBOSS в linux, Java 6. Приведенный выше код не обнаруживает присутствие ß, когда он включает код в указанное выше приложение. Удивительно, если я скомпилирую тот же файл в рабочей области eclipse, а затем применим патч в приложении, он работает как ожидалось!

Примечание:

  • Среда создания приложения - это черный ящик для меня, поэтому нет идеи, существует ли какая-либо опция -encoding для команды javac или что-то вроде этого
  • My eclipse JRE - это java8, но версия для компилятора для проекта - это Java6
  • Я изменил значение от ß до уникода, эквивалентного \u00DF в объявлении массива, но все же поведение такое же.

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

  • Когда я декомпилировал созданный файл класса, объявленное значение символьного массива было отображено как 65533, что \uFFFD, ничего, кроме символа замены, который используется для неопознанного символа. Я использовал JD-GUI как декомпилятор, который я не считаю заслуживающим доверия!

Вам нужна помощь! Я уверен, что это не то же самое, что: вопрос с вопросом о бета-версии Java equalsIgnoreCase терпит неудачу с ß ( "Sharp S" используется в немецком алфавите)

Заранее спасибо

Ответ 1

Спасибо за ваше время и ответы!

Фактическая проблема заключалась в том, что файл класса не был сгенерирован в сборке, поэтому изменение не отражалось. Использование значения un unicode\u00DF в исходном файле java должно работать нормально.

Ответ 2

Я думаю, что ваша проблема - это кодирование ß. У вас есть два варианта решения вашей ошибки:

  • Сначала преобразуйте исходный код java в символы ascii, а затем скомпилируйте его:

    native2ascii "your_class_file.java"
    javac "your_class_file.java"
    
  • Скомпилируйте свой java файл с вашей кодировкой, utf-8 в linux и iso-8859-15 в окнах:

    javac -encoding "encoding" "your_class_file.java"
    

Насколько я могу судить об этом, он должен был работать с заменой "ß" на "\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.