Компиляция (javac) исходного кода Java в кодировке UTF8 с использованием спецификации - PullRequest
15 голосов
/ 21 марта 2012

Здравствуйте и спасибо за чтение моего поста.

Моя проблема заключается в следующем: я хочу скомпилировать исходный файл Java с помощью «javac», причем этот файл имеет кодировку UTF-8 с BOM (ОС WinXP).

Вот что я делаю:

1) Создайте файл с помощью «Блокнота» и выберите кодировку UTF-8

dos> notepad Test.java
"File -> Save as..."
File name   : Test.java
Save as type: All Files
Encoding    : UTF-8
Save

2) Создайте класс Java в этом файле и сохраните файл как в 1)

public class Test
{
    public static void main(String [] args)
    {
        System.out.println("This is a test.");
    }
}

3) Визуализация шестнадцатеричной версии файла (первая строка)

dos> xxd Test.java | head -1
0000000: efbb bf70 7562 6c69 6320 636c 6173 7320  ...public class

Примечание: ef bb bf - это кодированная UTF-8 спецификация (кодированная UTF-16 - FE FF ).

4) Попробуйте скомпилировать этот код с помощью "javac"

dos> javac -encoding utf8 Test.java
Test.java:1: illegal character: \65279
?public class Test
^
1 error

Примечание: 65279 - десятичная версия спецификации.

У меня следующий вопрос: как я могу заставить эту компиляцию работать:

  • с кодировкой UTF-8
  • и ведение спецификации?

Спасибо за помощь и наилучшие пожелания.

Леа

Ответы [ 3 ]

23 голосов
/ 03 февраля 2013

Обрезать спецификацию и затем использовать javac -encoding utf8 x.java

15 голосов
/ 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", я ухожуэто здесь для будущих читателей.

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

https://stackoverflow.com/a/28043356/7050261

На самом деле использование спецификации в файлах UTF-8 полезно, чтобы отличить файл с кодировкой ANSI от файла с кодировкой Unicode.

На самом деле

  • BOM не о различении ANSI и Unicode.Не используйте функцию по назначению, для которой она не предназначена.

  • UTF-8 был специально разработан для обратной совместимости с ANSI, поэтому большая часть кода, написанного для обработки форматированного текста, полагаласьтолько на 0,127 байт (XML, JSON и т. д.) должны корректно работать с текстом в кодировке UTF-8 без каких-либо изменений.

...