Предупреждение "несопоставимый символ для кодировки" в Java

113

В настоящее время я работаю над 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 отобразит символ до даты, но это должен быть символ авторского права и отображаться в предупреждении в виде вопросительного знака в ромбе.

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

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

Seanhodges
источник
быть заинтересованным в том, чтобы на самом деле знать, какие байты составляют этот символ авторского права, т.е. hexdump AppDBCore.javaя как-то сомневаюсь в этом, \u00a9и вместо этого это что-то, что работает частично для вас из-за настройки вашей системы. Знак вопроса выше используется для замены входящего символа, значение которого неизвестно или невозможно
jar

Ответы:

56

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

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

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";
Джон Скит
источник
13
Будьте осторожны с символами \ uNNNN ... они разбираются перед лексическим анализом. Например, если вы поместите этот комментарий / * c: \ unit * / в свой код, он больше не будет компилироваться, потому что «nit» не является правильным шестнадцатеричным числом.
Петер Штибрани
3
Абсолютно. (С этим лучше справиться в C #, где экранирование Unicode применяется только в определенных контекстах, но есть еще и опасная escape-последовательность \ x, что ужасно.)
Джон Скит,
5
Это больше похоже на пластырь, чем на лекарство. Настоящая проблема заключается в том, что вы говорите javac ожидать, что исходные файлы будут в UTF-8, когда они действительно находятся в однобайтовой кодировке, такой как ISO-8859-1 или windows-1252.
Алан Мур
6
@Alan M: По моему опыту, гораздо проще убедиться, что у вас не возникнет проблем, сохраняя исходные файлы в ASCII, чем использовать правильную кодировку везде, где может быть скомпилирован ваш исходный код (Ant, Eclipse, ИДЕЯ и т. Д.).
Джон Скит,
6
@Jon, это фундаментальный недостаток Java; тот факт, что исходный модуль Java закодирован в UTF-8, ISO 8859-1, CP1252, MacRoman или что-то еще, обрабатывается как метаданные, внешние по отношению к исходному модулю, который в них нуждается. Это заставляет вас не забывать исправлять файл ant или конфигурацию Eclipse и т. Д. Как вы правильно заметили, это абсолютно худший способ сделать это, потому что информация хрупкая и легко теряется. Языки, которые хранят метаданные (метаданные кодирования) и данные (читай: исходный код) вместе в одном месте, гораздо более надежны в этом отношении. Это единственный разумный подход.
tchrist
91

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

Фернандо На
источник
1
Мне нравится это решение. Я добавил «-encoding UTF-8» в качестве компилятора в свой файл ant build.xml, и я все еще получаю «предупреждение: несопоставимый символ для кодирования ASCII». Если я изменю его на «-encoding jjjj», он не будет компилироваться, жалуясь на «ошибку: неподдерживаемая кодировка: jjjj», поэтому я знаю, что он распознает UTF-8, но, похоже, он по-прежнему обрабатывает файлы .java как ascii. Вздох.
dfrankow
1
Я пробовал параметр "кодировка" задачи ant javac, та же проблема. Он распознает параметр, но затем как-то его игнорирует.
dfrankow
20
@dfrankow: вы должны добавить в свой файл <compilerarg line="-encoding utf-8"/>соответствующий <javac>вызов Build.xml. Это плохой способ сделать это, но у вас нет выбора. Смотрите мой длинный комментарий вверху.
tchrist
У меня была та же проблема, когда я добавил compilearg в скрипт ant, он работал нормально, я построил это из командной строки Windows, странная проблема в том, что я был построен из затмения, он завел небо с помощью compilearg, похоже, что затмение Thakes забота права кодирования.
simonC
Это помогло мне :) для MAC OSX
Арун Абрахам
44

Если вы используете 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>
Томас Леонард
источник
Это правильный подход, если люди используют maven для создания своего проекта, спасибо за то, что поделились.
Шамик
2
Плагин javadoc также будет жаловаться на несопоставимый символ. Желательно установить project.build.sourceEncodingсвойство.
Эммануэль Бург,
Я уже использовал свойство project.build.sourceEncoding, но каким-то образом оно не отображалось должным образом в свойстве кодирования компилятора. Настройка явно сработала
Федерико Бонелли
32

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

Все, что вам нужно сделать, это указать переменную окружения под названием 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/

nightlyop
источник
вау, это работает, я просто добавляю это в свой .bashrc, и моя проблема решена.
cowboi-peng
Работает отлично, из командной строки, которую я ввел для сборки: javac MyJavaFile.java -encoding utf-8 -cp .;lib\*затем при ее запуске мне не нужно было добавлять эту дополнительную часть кодирования.
Azurespot,
23

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

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   
Alobes5
источник
Вы можете установить кодировку compileTestJavaи javadocа
Фрэнк Neblung
8

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

javac -encoding UTF-8 HelloWorld.java

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

введите описание изображения здесь

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

Alupotha
источник
8

Шаги 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"}
Люк Маховски
источник
2

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

    <?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>
Dxx0
источник
1

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

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

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

baybora.oren
источник
1
Ваше описание «Вы увидите нормальный символ [a] utf8, когда [программируете], но [фоном] будет код utf8») не имеет смысла. Также см. Мой длинный комментарий в ответ на вопрос выше.
tchrist
Я изменил его на ISO-8859-1, но по-прежнему получал ошибку компиляции о "несопоставимом символе для кодировки UTF8".
pacoverflow
1

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

Кельвин Гудсон
источник
1

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

                    mvn -Dproject.build.sourceEncoding=UTF-8
5122014009
источник
1

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

Джакар
источник