У меня есть программа, которая позволяет пользователю вводить код Java в форматируемое поле и затем компилировать его с помощью компилятора Java. Каждый раз, когда я пытаюсь скомпилировать код, что я записал, что получаю ошибку, которая говорит, что у меня есть запрещенный символ в начале моего кода, который не является там. Это - ошибка, которую компилятор дает мне:
C:\Users\Travis Michael>"\Program Files\Java\jdk1.6.0_17\bin\javac" Test.java
Test.java:1: illegal character: \187
public class Test
^
Test.java:1: illegal character: \191
public class Test
^
2 errors
Запись на CD-ROM генерируется, скажем, File.WriteAllText() или StreamWriter, когда вы не указываете кодировку. По умолчанию используется кодировка UTF8 и генерируется BOM. Об этом можно рассказать java-компилятору с помощью опции -encoding из командной строки.
Путь наименьшего сопротивления - избежать генерации BOM. Сделайте это, указав System.Text.Encoding.Default, который запишет файл с символами в кодовую страницу операционной системы по умолчанию и не запишет BOM. Используйте перегрузку File.WriteAllText(String, String, Encoding) или конструктор StreamWriter(String, Boolean, Encoding).
Просто убедитесь, что созданный вами файл не будет скомпилирован машиной в другом уголке мира. Он выдаст mojibake.
.http://en.wikipedia.org/wiki/Byte_order_mark
Знак порядка байтов (BOM) - это уникод. символ, используемый для сигнала эндианность (порядок байт) текстового файла или ручей. Его точка кода - U+FEFF. Использование BOM является необязательным, и, если использовать, должен появиться в начале текста ручей. Помимо его специфического использования в качестве индикатор порядка байтов, запоминающее устройство символ может также указывать на то, какой из несколько представлений Юникода Текст закодирован в.
BOM - забавный символ, который вы иногда находите в начале потоков Юникода, давая подсказку, что такое кодировка. Обычно он невидимо обрабатывается с помощью строк на Java, так что вы, должно быть, как-то перепутали его, но не увидев свой код, трудно понять где.
Вы могли бы тривиально исправить это, вручную удалив BOM из строки перед подачей в javac
. Вероятно, она квалифицируется как пробел, поэтому попробуйте вызвать trim()
на входной строке, и передать вывод на javac
.
Это знак байтового порядка, как все говорят.
javac не понимает BOM, даже когда вы пытаетесь сделать что-то вроде
javac -encoding UTF8 Test.java
Вам нужно удалить BOM или преобразовать исходный файл в другую кодировку. Блокнот++ может конвертировать одну кодировку файла, я не знаю пакетной утилиты на Windows-платформе для этого.
javac-компилятор будет предполагать, что файл находится в кодировке вашей платформы по умолчанию, так что если вы используете эту кодировку, вам не нужно указывать кодировку.
.