В вашем коде нет ничего плохого.Проблема в том, как компилятор обрабатывает ваш исходный код.
Когда вы пишете "Ñ"
в своем коде и сохраняете файл, какие байты фактически записываются в исходный файл?
Похоже, высохранил исходный файл как файл UTF-8 (который обычно является хорошим выбором).Это означает, что "Ñ"
было записано в файл в виде байтов UTF-8 0xC3 0x91.
Если вы должны были скомпилировать его в любой операционной системе, кроме Windows, где системная кодировка по умолчанию - UTF-8,будет собираться и работать точно так, как вы ожидаете.
Но при сборке в Windows, где системная кодировка по умолчанию - windows-1252, эти два байта в исходном файле обрабатываются по-разному.Компилятор интерпретирует эти два байта, используя windows-1252.Независимо от того, как код выглядит в вашем редакторе, компилятор видит 0xC3 0x91 и обрабатывает каждый байт как windows-1252 символ .В windows-1252 эти байты представляют собой:
Таким образом, компилятор компилирует вашу строковую константу как `" Ã '".
Весь этот перевод выполнялся только во время компиляции,В скомпилированном файле .class все строковые константы представлены одинаково;любая информация о том, как был закодирован источник, теряется.Во время выполнения Java знает только, что вы (очевидно) скомпилировали вашу строку как "Ñ"
.
Во время выполнения, когда вы декодируете эту двухсимвольную строку с использованием UTF-8, вы получаете байтовые последовательности UTF-8для этих двух символов:
Ã
→ 0xc3 0x83 ‘
→ 0xe2 0x80 0x98
Решение, как вы уже догадались,сообщить компилятору, что ваши исходные файлы находятся в UTF-8, поэтому он будет интерпретировать байты 0xc3 0x91 как Ñ
.