Кодировка символов различаются
Любой инструмент может написать исходный код Java в любой кодировке. Даже идея .java-файла не определена Java Language Spec. Любой IDE может сохранять исходный код Java любым способом, которым он хочет † с любой кодировкой.
Инструменты несут ответственность за предоставление в полном объеме последовательности символов, совместимых с Unicode, в инструментальную цепочку компилятора. Как они собирают и сохраняют исходный код, зависит от конкретных инструментов.
Состояния Язык спецификации Java в Chapter 3 Lexical Structure:
Программы, написанные с использованием набора символов Unicode. Информация об этом наборе символов и связанных с ним кодировках символов может быть найдена по адресу http://www.unicode.org/.
Так предположительно файл исходного кода Java будет использовать один из кодировки символов, общих с Unicode, такие как UTF-8, UTF-16 или UCS-2.
Section 3.2 Lexical Translations упоминает, что программа Java может использовать кодирование, такие как ASCII путем внедрения Юникода ускользает:
Юникода побег вида \ ихххх, где хххх является значением hexadecimal, представляет собой кодовый блок UTF-16 чье кодирование равно xxxx.
Хотя UTF-8 распространен в моем опыте, это не единственная возможная кодировка. Вы должны знать или угадывать кодировку какого-либо конкретного исходного файла, и вы должны учитывать расширение любых экранов Unicode.
Другие вопросы
Кстати, обратите внимание, что по крайней мере в Oracle JDK, то byte order mark (BOM)optional to UTF-8 файлов не разрешено в Java из-за ошибки (JDK-4508058), который никогда не будет фиксированной (из-за отсталой -совместимость).
Также обратите внимание, что line terminators может отличаться: символы ASCII CR (ПЕРЕВОЗКА ПЕРЕВОЗКИ), или LF (LINE FEED), или CR LF.
White space различается: SPACE (SP), ХАРАКТЕРНАЯ ТАБУЛЯЦИЯ (HT) (горизонтальная вкладка), FORM FEED (FF) и терминаторы линий.
Прочитать спецификацию для получения дополнительной информации.Например, в отношении заменителя характера:
В качестве специальной концессии для совместимости с некоторыми операционными системами, в ASCII SUB символ (\ u001a, или управление-Z) игнорируется, если он является последним символом в экранированном ввода поток.
О кодировке символов
Убедитесь, что вы понимаете основы Unicode и кодировки символов. Лучшее место для начала: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) от Joel Spolsky.
† Даже предполагаемые правила, такие как «один публичный класс в .java файл» может быть определена с помощью специальных инструментов, а не самой Java. Инструменты CodeWarrior для Java-обратного пути - при поддержке нескольких классов для каждого файла.
Нет. Вы должны прочитать файл, используя тот же набор символов, который использовался для сохранения файла, что бы это ни было. Обычно это собственная кодовая страница ПК, например. 'CP1252', если вы используете Windows в США. Вы можете стандартизировать свои собственные источники Java, чтобы всегда использовать UTF-8, если хотите, но любые файлы, которые вы получаете из других источников, возможно, необходимо будет преобразовать. – Andreas
, так есть способ определить кодировку файлов? –
К сожалению, нет. Файлы UTF-16 обычно легко идентифицируются с помощью спецификации. Файлы UTF-8 не должны иметь спецификацию, поэтому нет никакой возможности увидеть разницу между UTF-8, CP1252, ISO 8859-1, CP1251 или любой другой кодовой страницей. – Andreas