Ошибка «Невозможно отобразить кодировку UTF-8» - PullRequest
62 голосов
/ 14 февраля 2011

Я получаю ошибку компиляции при следующем методе.

public static boolean isValidPasswd(String passwd) {
    String reg = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$";
    return Pattern.matches(reg, passwd);
}
at Utility.java:[76,74] unmappable character for 
enoding UTF-8. 74th character is' " '

Как я могу это исправить? Спасибо.

Ответы [ 10 ]

45 голосов
/ 14 февраля 2011

У вас проблема с кодировкой файла исходного кода. Возможно, это кодируется ISO-8859-1, но компилятор был настроен на использование UTF-8. Это приведет к ошибкам при использовании символов, которые не будут иметь одинаковое представление байтов в UTF-8 и ISO-8859-1. Это произойдет со всеми символами, которые не являются частью ASCII, например, ¬ NOT SIGN .

Вы можете смоделировать это с помощью следующей программы. Он просто использует вашу строку исходного кода и генерирует байтовый массив ISO-8859-1 и декодирует это «неправильно» с кодировкой UTF-8. Вы можете увидеть, в каком месте линия повреждена. Я добавил 2 пробела в ваш исходный код, чтобы они соответствовали позиции 74, чтобы она соответствовала ¬ NOT SIGN , который является единственным символом, который генерирует разные байты в кодировке ISO-8859-1 и UTF-8 кодирование. Я предполагаю, что это будет соответствовать отступу с реальным исходным файлом.

 String reg = "      String reg = \"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¬.,-])(?=[^\\s]+$).{8,24}$\";";
 String corrupt=new String(reg.getBytes("ISO-8859-1"),"UTF-8");
 System.out.println(corrupt+": "+corrupt.charAt(74));
 System.out.println(reg+": "+reg.charAt(74));     

, что приводит к следующему выводу (испорчен из-за разметки):

String reg = "^ (? =. [0-9]) (? =. [az]) (? =. [AZ]) (? =. [~ #;:? / @ &! "'% * = ., -]) (? = [^ \ S] + $). {8,24} $" ;:

String reg = "^ (? =. [0-9]) (? =. [az]) (? =. [AZ]) (? =. [~ #;:? / @ &! "'% * = ¬., -]) (? = [^ \ S] + $). {8,24} $" ;: ¬

Смотрите "вживую" в https://ideone.com/ShZnB

Чтобы исправить это, сохраните исходные файлы в кодировке UTF-8.

12 голосов
/ 29 июля 2014

Я нахожусь в процессе настройки сервера сборки CI на компьютере с Linux для устаревшей системы, начатой ​​в 2000 году. Есть раздел, который генерирует PDF, содержащий символы не-UTF8.Мы находимся на последнем этапе релиза, поэтому я не могу заменить персонажей, которые вызывают у меня горе, но по причинам Дильбертеса я не могу ждать неделю, чтобы решить эту проблему после релиза.К счастью, команда «javac» в Ant имеет параметр «encoding».

 <javac destdir="${classes.dir}" classpathref="production-classpath" debug="on"
     includeantruntime="false" source="${java.level}" target="${java.level}"

     encoding="iso-8859-1">

     <src path="${production.dir}" />
 </javac>
6 голосов
/ 14 февраля 2011

Компилятор Java предполагает, что ваш ввод имеет кодировку UTF-8, либо потому, что вы указали его, либо потому, что это кодировка вашей платформы по умолчанию.

Однако данные в ваших .java файлах фактически не являютсязакодировано в UTF-8.Возможно, проблема в символе ¬.Убедитесь, что выбранный вами редактор (или IDE) действительно сохраняет свой файл в кодировке UTF-8.

3 голосов
/ 08 марта 2016

Для пользователей IntelliJ это довольно легко, когда вы узнаете, какова была оригинальная кодировка. Вы можете выбрать кодировку в правом нижнем углу вашего окна, вам будет предложено диалоговое окно с надписью:

Выбранная кодировка ('[тип кодировки]') может изменить содержимое '[Ваш файл]'. Вы хотите перезагрузить файл с диска или конвертировать текст и сохранить в новой кодировке?

Таким образом, если вам удалось сохранить несколько символов в какой-то нечетной кодировке, сначала вам нужно выбрать «Перезагрузить», чтобы загрузить все файлы в кодировке плохих символов. Для меня это перевернуло? символы в их правильное значение.

IntelliJ может определить, правильно ли вы выбрали кодировку, и предупредит вас. Вернитесь назад и попробуйте снова.

Как только вы увидите, что плохие символы исчезают, измените поле выбора кодировки в правом нижнем углу обратно на формат, который вы изначально хотели (если вы гуглите это сообщение об ошибке, это, скорее всего, будет UTF-8). На этот раз нажмите кнопку «Преобразовать» в диалоговом окне.

Мне нужно было перезагрузить как «windows-1252», а затем преобразовать обратно в «UTF-8». Символами-нарушителями были одинарные кавычки (‘и’), которые, вероятно, были вставлены из документа Word (или электронной почты) с неверной кодировкой, и указанные выше действия преобразуют их в UTF-8.

3 голосов
/ 12 июня 2015

Спасибо Michael Konietzka (https://stackoverflow.com/a/4996583/1019307) за ваш ответ.

Я сделал это в Eclipse / STS:

Preferences > General > Content Types > Selected "Text" 
    (which contains all types such as CSS, Java Source Files, ...)
Added "UTF-8" to the default encoding box down the bottom and hit 'Add'

Бинго, ошибка исчезла!

3 голосов
/ 14 января 2015

В eclipse попробуйте перейти к свойствам файла (Alt + Enter) и изменить ресурс -> 'Кодировка текстового файла' -> на Другое на UTF-8.Снова откройте файл и убедитесь, что где-то в строке / файле будет ненужный символ.Убери это.Сохраните файл.

Измените Ресурс кодирования -> 'Кодировка текстового файла' обратно на По умолчанию.

Скомпилируйте и разверните код.

2 голосов
/ 14 февраля 2011

Компилятор использует кодировку символов UTF-8 для чтения вашего исходного файла. Но файл должен быть написан редактором с использованием другой кодировки. Откройте файл в редакторе с кодировкой UTF-8, исправьте кавычку и сохраните его снова.

Кроме того, вы можете найти точку Unicode для символа и использовать экранирование Unicode в исходном коде. Например, символ A можно заменить на escape-код Unicode \u0041.

Кстати, вам не нужно использовать якоря начала и конца строки ^ и $ при использовании метода matches(). Вся последовательность должна соответствовать регулярному выражению при использовании метода matches(). Якоря полезны только при использовании метода find().

1 голос
/ 20 мая 2013

«ошибка: не отображаемый символ для кодировки UTF-8» означает, что java обнаружил символ, который не представлен в UTF-8. Следовательно, откройте файл в редакторе и установите кодировку символов в UTF-8. Вы должны быть в состоянии найти символ, который не представлен в UTF-8. Снимите этот символ и перекомпилируйте.

1 голос
/ 14 февраля 2011

Следующие компиляции для меня:

class E{
   String s = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[~#;:?/@&!\"'%*=¼.,-])(?=[^\\s]+$).{8,24}$";
}

См .:

enter image description here

0 голосов
/ 17 ноября 2015

Я наблюдал эту проблему при использовании Eclipse. Мне нужно было добавить кодировку в мой файл pom.xml, и это решило. http://ctrlaltsolve.blogspot.in/2015/11/encoding-properties-in-maven.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...