Запрещенный символ при попытке скомпилировать код Java

У меня есть программа, которая позволяет пользователю вводить код 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
23
задан Chad Carisch 23 January 2014 в 19:48
поделиться

4 ответа

Запись на 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.

.
17
ответ дан 29 November 2019 в 01:49
поделиться
  1. При использовании IDE укажите кодировку java-файла (через панель свойств)
  2. Если НЕ используете IDE, используйте расширенный текстовый редактор (я могу порекомендовать Блокнот++) и установите кодировку на "UTF без BOM", или "ANSI", если вам это подходит.
4
ответ дан 29 November 2019 в 01:49
поделиться

http://en.wikipedia.org/wiki/Byte_order_mark

Знак порядка байтов (BOM) - это уникод. символ, используемый для сигнала эндианность (порядок байт) текстового файла или ручей. Его точка кода - U+FEFF. Использование BOM является необязательным, и, если использовать, должен появиться в начале текста ручей. Помимо его специфического использования в качестве индикатор порядка байтов, запоминающее устройство символ может также указывать на то, какой из несколько представлений Юникода Текст закодирован в.

BOM - забавный символ, который вы иногда находите в начале потоков Юникода, давая подсказку, что такое кодировка. Обычно он невидимо обрабатывается с помощью строк на Java, так что вы, должно быть, как-то перепутали его, но не увидев свой код, трудно понять где.

Вы могли бы тривиально исправить это, вручную удалив BOM из строки перед подачей в javac. Вероятно, она квалифицируется как пробел, поэтому попробуйте вызвать trim() на входной строке, и передать вывод на javac.

.
3
ответ дан 29 November 2019 в 01:49
поделиться

Это знак байтового порядка, как все говорят.

javac не понимает BOM, даже когда вы пытаетесь сделать что-то вроде

javac -encoding UTF8 Test.java

Вам нужно удалить BOM или преобразовать исходный файл в другую кодировку. Блокнот++ может конвертировать одну кодировку файла, я не знаю пакетной утилиты на Windows-платформе для этого.

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

.
14
ответ дан 29 November 2019 в 01:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: