Подтвердить что ты не робот

Как скомпилировать исходный файл java, который кодируется как "UTF-8"?

Я сохранил исходный файл Java, указав его тип кодировки как UTF-8 (используя Notepad, по умолчанию тип кодировки Notepad - ANSI), а затем я попытался скомпилировать его, используя:

javac -encoding "UTF-8" One.java

но он дал сообщение об ошибке

One.java:1: illegal character: \65279

?public class One {

^
1 error

Есть ли другой способ, я могу скомпилировать это?

Вот источник:

public class One {
    public static void main( String[] args ){
        System.out.println("HI");
    }
} 
4b9b3361

Ответ 1

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

Если параметр -encoding не указан, используется конвертер по умолчанию платформы.

Десятичный 65279 - это шестнадцатеричный FEFF, который является Unicode Byte Order Mark (BOM). Это не нужно в UTF-8, потому что UTF-8 всегда кодируется как поток октетов и не имеет проблем с контентом.

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

Ответ 2

Откройте файл в Notepad ++ и выберите Encoding → Convert to UTF-8 без спецификации.

Ответ 3

Это не проблема с вашим текстовым редактором, это проблема с javac! Спецификация Unicode говорит, что спецификация в UTF-8 полезна, она не говорит, что это запрещено! Если спецификация может быть там, то javac HAS для ее обработки, но это не так. Фактически, использование спецификации в файлах UTF-8 полезно для того, чтобы отличать ANSI-кодированный файл от кодированного в Юникоде файла.

Предлагаемое решение об удалении спецификации является лишь обходным решением, а не правильным решением.

Этот отчет об ошибке указывает, что эта "проблема" никогда не будет исправлена: http://bugs.java.com/view_bug.do?bug_id=4508058

Поскольку этот поток находится в двух лучших результатах Google для поиска "javac BOM", я оставляю это здесь для будущих читателей.

Ответ 5

Я знаю, что это очень старый поток, но у меня возникла аналогичная проблема с PHP вместо Java, и Google взял меня здесь. Я писал PHP на Notepad ++ (не простой Notepad) и заметил, что лишняя белая строка появляется каждый раз, когда я вызываю файл include. Firebug показал, что в этих дополнительных строках был 65279 символов.

Собственно, основной файл PHP и включенные файлы были закодированы в UTF-8. Однако Notepad ++ также имеет возможность кодировать как "UTF-8 без спецификации". Это решило мою проблему.

Нижняя строка: кодировка UTF-8 вставляет здесь и там этот дополнительный символ спецификации, если вы не указали своему редактору использовать UTF8 без спецификации.

Ответ 6

См. ниже Например, мы можем обсудить с Программой (слова телугу)

Программа (UnicodeEx.java)

class UnicodeEx {  
    public static void main(String[] args) {   
        double ఎత్తు = 10;  
        double వెడల్పు = 25;   
        double దీర్ఘ_చతురస్ర_వైశాల్యం;  
        System.out.println("The Value of Height = "+ఎత్తు+" and Width = "+వెడల్పు+"\n");  
        దీర్ఘ_చతురస్ర_వైశాల్యం = ఎత్తు * వెడల్పు;  
        System.out.println("Area of Rectangle = "+దీర్ఘ_చతురస్ర_వైశాల్యం);  
    }  
}

Это программа при сохранении как "UnicodeEx.java" и изменение кодировки на "unicode"

** Как скомпилировать **

javac -encoding "unicode" UnicodeEx.java

Как выполнить

java UnicodeEx

Значение высоты = 10,0 и ширина = 25,0

Область прямоугольника = 250.0

Ответ 7

Хорошо работает здесь, даже редактируется в Блокноте. Мораль истории - не используйте Блокнот. Там, вероятно, нецензурный персонаж, который Блокнот либо вставляет, либо счастливо скрывается от вас.

Ответ 8

У меня была та же проблема. Чтобы решить проблему, он открыл файл в шестнадцатеричном редакторе и обнаружил три "невидимых" байта в начале файла. Я удалил их, и компиляция сработала.

Ответ 9

  • Откройте файл с помощью WordPad или любого другого редактора, кроме Notepad.

  • Выберите тип "Сохранить как" как текстовый документ - формат MS-DOS

  • Повторно открыть проект

Ответ 10

Чтобы расширить существующие ответы с помощью решения для пользователей Linux:

Чтобы удалить спецификацию во всех файлах .java сразу, перейдите в исходный каталог и выполните

find -iregex '.*\.java' -type f -print0 | xargs -0 dos2unix

Требуется установить find, xargs и dos2unix, которые должны быть включены в большинство дистрибутивов. Первый оператор находит все .java файлы в текущем каталоге рекурсивно, второй преобразует каждый из них с помощью инструмента dos2unix, который предназначен для преобразования окончаний строк, а также удаляет спецификацию.

Преобразование окончаний строк не должно иметь никакого эффекта, поскольку оно должно быть уже в формате Linux \n для Linux, если вы правильно настроили управление версиями, но будьте осторожны, если это произойдет, если у вас есть один из тех редких случаев, когда это не предназначено.

Ответ 11

В Intellij Idea ("Настройки"> "Редактор"> "Кодировки файлов") кодировкой проекта была "windows-1256". Поэтому я использовал следующий код для преобразования статических строк в utf8

protected String persianString(String persianStirng) throws UnsupportedEncodingException {
    return new String(persianStirng.getBytes("windows-1256"), "UTF-8");
}

Теперь хорошо! В зависимости от кодировки файла вы должны изменить "windows-1256" на правильную