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


112

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

Варто відзначити, що символ з'являється у вихідному артефакті правильно, але попередження викликають неприємності, і файл, що містить цей клас, може одного разу торкнутися текстовим редактором, який зберігає кодування неправильно ...

Як я можу ввести цей символ у рядок "авторських прав", щоб компілятор був задоволений, а символ зберігався у файлі без потенційних проблем із перекодуванням?


зацікавтесь, щоб насправді знати, які байти складають цей авторський характер, тобто hexdump AppDBCore.javaя якось сумніваюся в його, \u00a9а натомість це щось, що частково працює для вас через налаштування вашої системи. Знак питання використовується для заміни вхідного символу, значення якого невідоме або нерепрезентабельне в Unicode hexutf8.com/…
jar

Відповіді:


56

Використовуйте формат "\ uxxxx".

Згідно з Вікіпедією , символом авторських прав є унікод U + 00A9, тому ваш рядок повинен читати:

String copyright = "\u00a9 2003-2008 My Company. All rights reserved.";

13
Будьте уважні з \ uNNNN символами ... вони розбираються, перш ніж робити лексичний аналіз. Наприклад, якщо ви додали цей коментар / * c: \ unit * / до свого коду, він більше не буде компілюватися, оскільки "nit" не є правильним шістнадцятковим номером.
Петро Штібрані

3
Зовсім. (Це краще вирішувати в C #, де вимкнення unicode застосовується лише в певних контекстах - але тоді є і небезпечна послідовність втечі \ x, що жахливо.)
Джон Скіт,

5
Це звучить скоріше як пов'язка, ніж ліки. Справжня проблема, здається, полягає в тому, що ви говорите javac очікувати вихідних файлів в UTF-8, коли вони дійсно в однобайтовому кодуванні, як ISO-8859-1 або Windows-1252.
Алан Мур

6
@Alan M: На мій досвід, набагато простіше переконатися, що у вас не виникне проблеми, зберігаючи вихідні файли в ASCII, ніж це переконайтеся, що ви використовуєте правильне кодування скрізь, де може бути складено ваш джерело (Ant, Eclipse, IDEA тощо).
Джон Скіт

6
@Jon, це фундаментальний недолік у Java; той факт, що вихідний блок Java кодується в UTF-8, ISO 8859-1, CP1252, MacRoman чи будь-якому іншому, обробляється на метаданих, що знаходяться поза джерельним джерелом, який потребує цього. Це змушує вас пам’ятати, щоб виправити файл мурашки або конфігурацію Eclipse тощо. Як ви правильно зазначаєте, це абсолютно найгірший спосіб зробити це, оскільки інформація неміцна і легко втрачається. Мови, які зберігають метадані (кодування метаданих) та даних (читайте: вихідний код) разом в одному місці, є набагато надійнішими в цьому. Це єдиний розумний підхід.
tchrist

91

Спробуйте з: javac -кодування ISO-8859-1 file_name.java


1
Мені подобається це рішення. Я додав "-кодування UTF-8" як компілятор у своєму ant. Build.xml і все одно отримую "попередження: неможливий символ для кодування ASCII". Якщо я зміню його на "-кодування jjjj", він не буде компілюватися, скаржившись на "помилку: непідтримуване кодування: jjjj", тому я знаю, що він розпізнає UTF-8, але все ще здається, що файли .java розглядаються як ascii. Зітхнути.
dfrankow

1
Я спробував параметр "кодування" завдання mrav javac, та сама проблема. Він розпізнає параметр, але потім його якось ігнорує.
dfrankow

20
@dfrankow: ви повинні додати <compilerarg line="-encoding utf-8"/>під відповідний <javac>виклик у своєму Build.xmlфайлі. Це поганий спосіб зробити це, але у вас немає вибору. Дивіться мій довгий коментар вгорі.
tchrist

У мене була така ж проблема, коли я додав збиральний аргумент до мурашного сценарію, він працював нормально, я будував це з командної лінії Windows, дивно тиг в тому, що я будував з затемнення це пішло, що евент вийшов як компіляарг, схоже, що затемнення загрожує турботою права кодування.
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/


вау, це працює, я просто додаю це до свого .bashrc, і це вирішило мою проблему.
ковбой-пенг

Працювало чудово, з командного рядка, який я ввів до складання: javac MyJavaFile.java -encoding utf-8 -cp .;lib\*Потім, запускаючи його, мені не потрібно було додавати цю додаткову частину кодування.
Azurespot

23

помістіть цей рядок у свій файл .gradle над конф. Java.

apply plugin: 'java'
compileJava {options.encoding = "UTF-8"}   

Ви можете встановити кодування compileTestJavaі javadocа
Френк Neblung

8

Більшість випадків ця помилка компіляції відбувається при компілюванні файлу unicode (UTF-8)

javac -encoding UTF-8 HelloWorld.java

а також Ви можете додати цю опцію компіляції до своєї IDE, наприклад: ідея Intellij
(Файл> налаштування> Компілятор Java) додати як додатковий параметр командного рядка

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

-кодування: кодування Встановлення імен кодування вихідного файлу, таких як EUC-JP та UTF-8 .. Якщо -кодування не вказано, використовується перетворювач за замовчуванням платформи. ( DOC )


8

Кроки Градле

Якщо ви використовуєте 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>

1

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

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

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


1
Ваш опис "Ви побачите звичайний символ [a] utf8, коли ви [програмуєте], але [фон] буде кодом utf8" не має сенсу. Також дивіться мій довгий коментар у відповідь на запитання вище.
tchrist

Я змінив його на ISO-8859-1, але все ж отримав помилку компіляції про "неможливий характер для кодування UTF8".
pacoverflow

1

У мене була така ж проблема, коли індекс символів, повідомлений у повідомленні про помилку Java, був неправильним. Я звузив його до символів подвійної цитати безпосередньо перед тим, як повідомлялося, що позиція є шестигранною 094 (скасувати замість цитати, але представлена ​​як цитата) замість шестигранної 022. Як тільки я змінив варіант на варіант hex 022, все було добре.


1

Якщо ви використовуєте Maven Build з командного рядка, ви також можете використовувати таку команду:

                    mvn -Dproject.build.sourceEncoding=UTF-8

1

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.