2016-06-04 2 views
1

Я читал этуКакую кодировку использовать при чтении в исходном файле java?

Should source code be saved in UTF-8 format

и я использую компилятор LIB затмение, но нужно прочитать некоторые источник файлов Java, чтобы кормить его в эту библиотеку. Кажется, он может храниться в разных форматах с этого поста.

Есть ли один Charset, который я могу использовать для его чтения, чтобы он работал каждый раз. Charset.forName («UTF-8»), может быть?

спасибо, Дин

+2

Нет. Вы должны прочитать файл, используя тот же набор символов, который использовался для сохранения файла, что бы это ни было. Обычно это собственная кодовая страница ПК, например. 'CP1252', если вы используете Windows в США. Вы можете стандартизировать свои собственные источники Java, чтобы всегда использовать UTF-8, если хотите, но любые файлы, которые вы получаете из других источников, возможно, необходимо будет преобразовать. – Andreas

+0

, так есть способ определить кодировку файлов? –

+0

К сожалению, нет. Файлы UTF-16 обычно легко идентифицируются с помощью спецификации. Файлы UTF-8 не должны иметь спецификацию, поэтому нет никакой возможности увидеть разницу между UTF-8, CP1252, ISO 8859-1, CP1251 или любой другой кодовой страницей. – Andreas

ответ

3

Кодировка символов различаются

Любой инструмент может написать исходный код 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-обратного пути - при поддержке нескольких классов для каждого файла.

+1

Хорошая запись, но вы не полностью покрываете точку вопроса, то есть кодировку исходных файлов .java. ['javac'] (https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javac.html) по умолчанию будет отображаться на кодовой странице ОС: * Если параметр' -encoding' не является указанным, тогда используется ** конвертер ** по умолчанию **. Eclipse (упомянутый в комментарии) может обрабатывать, что каждый исходный файл '.java' использует другую кодовую страницу, но если вы когда-либо захотите скомпилировать вне Eclipse, вы лучше использовать только одну кодовую страницу для всех исходных файлов. Если это не значение по умолчанию, оно должно быть явно указано. – Andreas

+0

@Andreas Кажется, вы сосредоточены на * выводе * на предполагаемом факте, что Eclipse переносит смесь исходных файлов в различных кодировках символов. Если true для Eclipse вообще и для «eclipse compiler lib» в частности, (я не знаю таких фактов), это кажется достаточно важным, чтобы гарантировать публикацию в качестве другого ответа здесь. Но мой ответ ссылается на заголовок («при ​​чтении в исходном файле java») и последнее предложение («одна кодировка, которую я могу использовать для чтения»), о * input *, о том, какую кодировку символов ожидать с исходными файлами Java. Как мой вступительный заголовок говорит: «Кодировки символов меняются». –

+0

Не знаю, где вы получили * выход * из. Я говорю о кодировании исходных файлов '.java', т. Е. * Input * в java-компиляторе. Я хотел сказать, что хотя Eclipse поддерживает смешанные кодировки символов, 'javac', Ant, Maven, Gradle и т. Д. Все делают массовую компиляцию с использованием одной кодировки, поэтому рекомендуется использовать одну кодировку для всех исходных файлов. Конечно, если вы только когда-либо создаете с помощью Eclipse, вы можете использовать функцию смешанной кодировки, но не иметь инструмента сборки в дополнение к инструменту IDE редко, по крайней мере, вне школ. – Andreas