it-swarm-ru.tech

Ошибка «Невозможно отобразить кодировку UTF-8»

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

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] не отображаемый символ для 
 кодирования UTF-8. 74-й символ - "" 

Как я могу это исправить? Благодарю.

62
Ravi

У вас проблема с кодировкой файла исходного кода. Возможно, это кодируется 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));     

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

Строка reg = "^ (? =. [0-9]) (? =. [az]) (? =. [AZ]) (= [~ #;:?!./@ & " '% * = -]?.?) (= [^\s] + $). {8,24} $ ";: �

Строка reg = "^ (? =. [0-9]) (? =. [az]) (? =. [AZ]) (= [~ #;:?!./@ & " '% * = ¬, -]?.?) (= [^\s] + $). {8,24} $ ";: ¬

Смотрите "в прямом эфире" на https://ideone.com/ShZnB

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

44
Michael Konietzka

Я нахожусь в процессе настройки сервера сборки 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>
12
Steve Gelman

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

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

6
Joachim Sauer

Спасибо 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
HankCa

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

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

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

3
john

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

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

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

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

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

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

3
cwash

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

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

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

2
erickson

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

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

Увидеть:

enter image description here

1
OscarRyz

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

1
Ganesh R