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


Я сохранил исходный файл Java, указав его тип кодировки как UTF-8 (используя Блокнот, по умолчанию тип кодировки Блокнота-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");
    }
} 
10 26

10 ответов:

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

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

Десятичных 65279 шестигранной FЭФФ, который является метку порядка следования байтов Юникода (спецификации). Это не нужно в UTF-8, потому что UTF-8 всегда кодируется как поток октета и не имеет проблем с эндианностью.

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

Откройте файл в Notepad++ и выберите Encoding - > Convert to UTF-8 without BOM.

Попробуйте javac -encoding UTF8 One.java

Без кавычек и это UTF8, без тире.

Смотрите эту тему форума для получения дополнительных ссылок

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

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

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

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

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

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

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

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

Программа (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-кодировка" unicode " UnicodeEx.java

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

Java UnicodeEx

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

Площадь прямоугольника = 250,0

Отлично работает здесь, даже отредактировано в блокноте. Мораль этой истории такова: Не используйте блокнот. Вероятно, там есть непечатный символ, который блокнот либо вставляет, либо счастливо скрывает от вас.

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

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

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

  • Откройте проект заново

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

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

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

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

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