Как скомпилировать исходный файл Java, который закодирован как "UTF-8"? - PullRequest
28 голосов
/ 13 ноября 2009

Я сохранил свой исходный файл 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");
    }
} 

Ответы [ 11 ]

45 голосов
/ 13 ноября 2009

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

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

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

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

20 голосов
/ 10 июня 2012

Откройте файл в Notepad ++ и выберите Кодировка -> Преобразовать в UTF-8 без спецификации.

10 голосов
/ 20 января 2015

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

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

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

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

9 голосов
/ 13 ноября 2009

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

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

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

4 голосов
/ 28 августа 2014

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

Программа (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

4 голосов
/ 04 февраля 2012

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

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

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

0 голосов
/ 10 июня 2019

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

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

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

0 голосов
/ 26 апреля 2017

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

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

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

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

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

0 голосов
/ 10 мая 2016
  • Откройте файл с помощью WordPad или любого другого редактора, кроме Блокнота.

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

  • Повторное открытие проекта

0 голосов
/ 21 сентября 2014

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

...