Нет таких вещей, как a String, которая была закодирована как ISO-8859-1 в памяти . Строки Java в памяти всегда являются строками Unicode. (Закодировано в UTF-16, но сейчас вам это не нужно).
Кодирование вступает в действие только тогда, когда вы вводите или выводите строку - тогда, при отсутствии явного кодирования, используется системное значение по умолчанию (которое в некоторых системах зависит от пользовательских настроек).
Как сказал McDowell, фактическая кодировка вашего исходного файла должна соответствовать кодировке, которую ваш компилятор предполагает относительно вашего исходного файла, в противном случае вы получите проблемы, как вы заметили. Вы можете достичь этого несколькими способами:
- Используйте опцию
-encoding
компилятора, предоставляя кодировку вашего исходного файла. (С помощью ant вы устанавливаете параметр encoding=
.)
- Используйте ваш редактор или любой другой инструмент (например,
recode
), чтобы изменить кодировку вашего файла на компилятор по умолчанию.
- используйте
native2ascii
(с правой опцией -encoding
), чтобы перевести ваш исходный файл в ASCII с \uXXXX
-escapes.
В последнем случае вы позже можете скомпилировать этот файл везде с любой кодировкой по умолчанию, так что это может быть правильным способом, если вы дадите исходный код лицам, не кодирующим код, для компиляции где-нибудь.
Если у вас большой проект, состоящий из более чем одного файла, все они должны иметь одинаковую кодировку, поскольку у компилятора есть только один такой переключатель, а не несколько.
Во всех проектах, которые у меня были в последние годы, я всегда кодирую все свои файлы в UTF-8, и в моем файле компоновки ant установите параметр encoding="utf-8"
для задачи javac. (Мой редактор достаточно умен, чтобы автоматически распознавать кодировку, но я по умолчанию установил UTF-8.)
Кодировка имеет значение для других инструментов обработки исходного кода, таких как javadoc. (Там вы должны дополнительно опции -charset
и -docencoding
для вывода - они должны совпадать, но могут отличаться от источника- -encoding
.)