В настоящее время я работаю над проектом Java, который при компиляции выдает следующее предупреждение:

/src/com/myco/apps/AppDBCore.java:439: warning: unmappable character for encoding UTF8
    [javac]         String copyright = "� 2003-2008 My Company. All rights reserved.";

Я не уверен, как SO отобразит символ до даты, но он должен быть символом авторского права и отображаться в предупреждении как вопросительный знак в ромбе.

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

Как я могу вставить этот символ в строку «авторских прав», чтобы компилятор был доволен и символ сохранился в файле без потенциальных проблем с перекодированием?

124
seanhodges 21 Янв 2009 в 14:17
Быть заинтересованным в том, чтобы узнать, какие байты составляют этот символ авторского права, т.е. hexdump AppDBCore.java Я как-то сомневаюсь в его \u00a9, и вместо этого это что-то, что работает частично для вас из-за настройки вашей системы. Вышеупомянутый вопросительный знак используется для замены входящего символа, значение которого неизвестно или не представляется в Юникоде hexutf8.com/…
 – 
jar
10 Сен 2016 в 00:28

12 ответов

Лучший ответ

Используйте escape-формат «\ uxxxx».

Согласно Wikipedia, символом авторского права является код Юникода U + 00A9, поэтому ваша строка должна гласить:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
56
Jon Skeet 21 Янв 2009 в 14:20
13
Будьте осторожны с символами \ uNNNN ... они разбираются перед лексическим анализом. Например, если вы поместите этот комментарий / * c: \ unit * / в свой код, он больше не будет компилироваться, потому что «nit» не является правильным шестнадцатеричным числом.
 – 
Peter Štibraný
21 Янв 2009 в 14:25
3
Абсолютно. (Это лучше обработать в C #, где экранирование Unicode применяется только в определенных контекстах, но есть еще и опасная escape-последовательность \ x, что ужасно.)
 – 
Jon Skeet
21 Янв 2009 в 14:38
5
Это больше похоже на пластырь, чем на лекарство. Настоящая проблема заключается в том, что вы говорите javac ожидать, что исходные файлы будут в UTF-8, когда они действительно находятся в однобайтовой кодировке, такой как ISO-8859-1 или windows-1252.
 – 
Alan Moore
27 Янв 2009 в 04:31
6
M: По моему опыту, намного проще убедиться, что у вас не возникнет проблем, сохранив исходные файлы в ASCII, чем убедиться, что вы используете правильную кодировку везде , где ваш исходный код может быть скомпилирован. (Ant, Eclipse, IDEA и т. Д.).
 – 
Jon Skeet
27 Янв 2009 в 09:38
6
@Jon, это фундаментальный недостаток Java; тот факт, что исходный модуль Java закодирован в UTF-8, ISO 8859-1, CP1252, MacRoman или что-то еще, обрабатывается метаданными, внешними по отношению к исходному модулю, который в них нуждается. Это заставляет вас не забыть исправить свой файл ant или конфигурацию Eclipse и т. Д. Как вы правильно заметили, это абсолютно худший способ сделать это, потому что информация хрупкая и легко теряется. Языки, которые хранят метаданные (метаданные кодирования) и данные (читай: исходный код) вместе в одном месте, гораздо более надежны в этом отношении. Это единственно разумный подход.
 – 
tchrist
15 Ноя 2010 в 14:04

Попробуйте: javac -encoding ISO-8859-1 имя_файла.java

95
Fernando Nah 25 Окт 2009 в 00:59
1
Мне нравится это решение. Я добавил «-encoding UTF-8» в качестве компилятора в свой файл ant build.xml, но все равно получаю «предупреждение: несопоставимый символ для кодирования ASCII». Если я изменю его на «-encoding jjjj», он не будет компилироваться, жалуясь на «ошибку: неподдерживаемая кодировка: jjjj», поэтому я знаю, что он распознает UTF-8, но, похоже, он по-прежнему обрабатывает файлы .java как ascii. Вздох.
 – 
dfrankow
3 Июл 2010 в 04:13
1
Я пробовал параметр "кодировка" задачи ant javac, та же проблема. Он распознает параметр, но затем как-то его игнорирует.
 – 
dfrankow
3 Июл 2010 в 07:04
21
@dfrankow: вы должны добавить <compilerarg line="-encoding utf-8"/> под соответствующим вызовом <javac> в вашем файле Build.xml. Это плохой способ, но у вас нет выбора. Смотрите мой длинный комментарий вверху.
 – 
tchrist
15 Ноя 2010 в 14:07
У меня была такая же проблема, когда я добавил compilearg в скрипт ant, он работал нормально, я построил его из командной строки Windows, странная проблема в том, что я был построен из eclipse, он warked eaven с помощью compilearg, похоже, что eclipse thakes care права кодирования.
 – 
simonC
10 Май 2012 в 11:46
Мне это помогло :) для MAC OSX
 – 
Arun Abraham
11 Ноя 2012 в 12:30

Если вы используете Maven, явно установите <encoding> в конфигурации плагина компилятора, например

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>2.3.2</version>
            <configuration>
                <encoding>UTF-8</encoding>
            </configuration>
        </plugin>
45
Thomas Leonard 28 Май 2012 в 18:27
Это правильный подход, если люди используют maven для создания своего проекта, спасибо за то, что поделились.
 – 
Shamik
18 Июл 2012 в 21:32
2
Плагин javadoc также будет жаловаться на несопоставимый символ. Предпочтительно устанавливать свойство project.build.sourceEncoding.
 – 
Emmanuel Bourg
14 Янв 2014 в 11:34
Я уже использовал свойство project.build.sourceEncoding, но каким-то образом оно не отображалось должным образом в свойстве кодирования компилятора. Явная настройка сделала трюк
 – 
Federico Bonelli
13 Окт 2014 в 16:53

Мне это помогло:

Все, что вам нужно сделать, это указать переменную окружения под названием JAVA_TOOL_OPTIONS. Если вы установите для этой переменной значение -Dfile.encoding = UTF8, каждый раз, когда запускается JVM, она будет получать эту информацию.

Источник: http://whatiscomingtomyhead.wordpress.com/2012/01/02/get-rid-of-unmappable-character-for-encoding-cp1252-once-and-for-all/

34
nightlyop 13 Фев 2014 в 17:28
Вау, это работает, я просто добавляю это в свой .bashrc, и это решает мою проблему.
 – 
cowboi-peng
31 Янв 2018 в 12:37
Работает отлично, из командной строки, которую я ввел для сборки: javac MyJavaFile.java -encoding utf-8 -cp .;lib\* Затем при запуске мне не нужно было добавлять эту дополнительную часть кодирования.
 – 
Azurespot
4 Фев 2020 в 05:45

Поместите эту строку в свой файл .gradle над Java conf.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   
25
Alobes5 14 Сен 2015 в 02:03
Вы можете установить кодировку для compileTestJava, а также для javadoc
 – 
Frank Neblung
24 Окт 2019 в 12:50

Шаги Gradle

Если вы используете Gradle, вы можете найти строку, которая применяет плагин java:

apply plugin: 'java'

Затем установите кодировку для задачи компиляции UTF-8:

compileJava {options.encoding = "UTF-8"}   

Если у вас есть модульные тесты, вы, вероятно, захотите скомпилировать их и с UTF-8:

compileTestJava {options.encoding = "UTF-8"}

Общий пример Gradle

Это означает, что общий код Gradle будет выглядеть примерно так:

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}
compileTestJava {options.encoding = "UTF-8"}
9
Luke Machowski 21 Окт 2018 в 13:42

Это сработало для меня -

    <?xml version="1.0" encoding="utf-8" ?>
<project name="test" default="compile">
    <target name="compile">
        <javac srcdir="src" destdir="classes" 
                           encoding="iso-8859-1" debug="true" />
    </target>
</project>
3
Dxx0 30 Апр 2017 в 04:53

Если вы используете eclipse (Eclipse может поместить для вас код utf8, даже если вы пишете символ utf8. При программировании вы увидите нормальный символ utf8, но в качестве фона будет код utf8);

  1. Выберите Проект .
  2. Щелкните правой кнопкой мыши и выберите Свойства .
  3. Выберите Ресурс на панели ресурсов (меню вверху справа, которое открывается через 2.)
  4. Вы можете увидеть на панели ресурсов , Кодировка текстового файла , выбрать другой, который вы хотите

P.S: это нормально, если вы используете статическое значение в коде. Например, String test = "İİİİİııııııççççç";

1
baybora.oren 7 Дек 2009 в 10:56
1
Ваше описание «Вы увидите нормальный символ [a] utf8, когда [программируете], но [фоном] будет код utf8») не имеет смысла. Также см. Мой длинный комментарий в ответ на вопрос выше.
 – 
tchrist
15 Ноя 2010 в 14:14
Я изменил его на ISO-8859-1, но по-прежнему получал ошибку компиляции о «несопоставимом символе для кодировки UTF8».
 – 
pacoverflow
10 Мар 2017 в 21:39

Если вы используете Maven Build из командной строки, вы также можете использовать следующую команду:

                    mvn -Dproject.build.sourceEncoding=UTF-8
1
5122014009 24 Июн 2015 в 18:06

Тем, кто задается вопросом, почему это происходит в одних системах, а не в других (с тем же источником, параметрами сборки и т. Д.), проверьте переменную среды LANG . Я получаю предупреждение / ошибку при LANG=C.UTF-8, но не при LANG=en_US.UTF-8.

1
jakar 14 Апр 2020 в 22:07

В большинстве случаев эта ошибка компиляции возникает при компиляции файла в кодировке unicode (кодировка UTF-8).

javac -encoding UTF-8 HelloWorld.java

А также вы можете добавить эту опцию компиляции в свою IDE Пример: идея Intellij
(Файл> Настройки> Компилятор Java) добавить в качестве дополнительного параметра командной строки

enter image description here

-encoding: кодировка Задайте имя кодировки исходного файла, например EUC-JP и UTF-8. Если -encoding не указан, используется конвертер по умолчанию для платформы. (DOC)

9
Alupotha 5 Апр 2015 в 09:17

У меня была та же проблема, когда индекс символа, указанный в сообщении об ошибке Java, был неверным. Я сузил его до символов двойных кавычек непосредственно перед тем, как сообщаемая позиция была шестнадцатеричной 094 (отмена вместо кавычки, но представленная как кавычка) вместо шестнадцатеричного 022. Как только я поменял местами на шестнадцатеричный вариант 022, все было в порядке.

1
Kelvin Goodson 22 Июн 2010 в 16:14