2014-07-28 1 views
10

У меня возникла странная проблема. В нижеприведенном фрагменте кода я ищу присутствие ß.Проблема с компиляцией 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, а затем применим патч в приложении, он работает так, как ожидалось!

Очки отметить:

  1. Сборки приложений среда не является черным ящиком для меня, поэтому не знает, если есть какая-либо -encoding опция присутствует для команды JAVAC или что-то вроде этого
  2. Мой Eclipse JRE - это java8, но версия для компилятора, установленная для проекта, - это Java6
  3. Я изменил значение с ß на unicode, эквивалентное \ u00DF в объявлении массива, но все же поведение такое же.

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

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

Нужна помощь людям! Я уверен, что это не так же, как: случай чувствительный вопрос бета Java's equalsIgnoreCase fails with ß ("Sharp S" used in German alphabet)

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

+2

Я подозреваю, что вы не сохранили исходный код как UTF-8 –

ответ

1

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

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

2

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

  1. Сначала конвертировать Java исходный код в ASCII символов, а затем компилировать его:

    native2ascii "your_class_file.java" 
    javac "your_class_file.java" 
    
  2. Составьте свой файл Java с кодировкой, utf-8 на Linux и iso-8859-15 на окнах:

    javac -encoding "encoding" "your_class_file.java" 
    

насколько Я могу судить об этом, он должен был работать с заменой "ß" на "\u00df". Если вышеприведенные решения не работают, напечатайте каждый символ и его значение unicode до System.out и посмотрите, какой символ является «ß».

Другая ошибка может заключаться в том, что вы читаете текст в кодировке, которая не поддерживает ß; попробуйте прочитать ваши строки, читая байты и вызов:

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.