Получить имя файла как UTF-8?(ä, ü, ö ... всегда '?') - PullRequest
4 голосов
/ 25 мая 2011

Я должен прочитать имена некоторых файлов и поместить их в список в виде строки.Это не так сложно, у меня просто есть некоторые проблемы с такими персонажами, как ä, ö, ü ... они всегда как '?'в моей строке.

В чем проблема?Ну и кодировка.Хорошо, это должно быть легко ... вот что я думал.Поэтому я попытался использовать такие функции, как:

new String(insert.getBytes("UTF-8") или new String(insert.getBytes("ISO-8859-1"), "UTF-8"), потому что большинство файлов - ISO-8859-1

.Это мой код:

...
File[] fileList = dir.listFiles();
String insert;
for(File f : fileList) {
...
insert=f.getName().substring(0,f.getName().length()-4);
                insert=insert.charAt(0)+insert.substring(1,insert.length()).toLowerCase().replaceFirst("([0-9]*(_s?(i)?(_dat)?)*$)", "").replaceFirst("_", " ");
...
System.out.println("test UTF8: " + new String(insert.getBytes("UTF-8"))); //not helping
System.out.println("test ISO , UTF8: " + new String(insert.getBytes("ISO-8859-1"), "UTF-8")); //not helping
...
names.add(insert);
}

В конце есть много строк с '?'персонажи в моем списке.Как решить проблему?И как лучше, если есть не только файлы ISO-8859-1?(допустим, есть много неизвестных закодированных файлов)

Спасибо!

Ответы [ 5 ]

3 голосов
/ 25 мая 2011

Учитывая расширенные комментарии под вопросом, теперь похоже, что это либо проблема со шрифтом, либо (возможно, более вероятно) проблема с кодировкой имени файла.

Я попросил Лисси выполнить следующую команду, чтобыдавайте выясним, в чем проблема.Если она уверена, что имя файла содержит «ä», но этот символ не появляется, когда она ls имя файла, то эта команда сообщит нам, является ли это проблемой со шрифтом или кодировкой.

touch filenäme
ls filen*me

Если это показывает "filenäme" в выводе ls, тогда мы знаем, что проблема заключается в создании / копировании файлов в эту систему.Это может произойти, если программа, создавшая файлы, не поняла, что такое кодировка файловой системы, или была слишком глупой, чтобы делать правильные вещи.Программа convmv, вероятно, будет лучшим способом исправить это.

convmv -f ENCODING -t utf8 -r .

Вопрос в том, какова правильная кодировка.Возможности включают UTF-16, cp850 или, возможно, iso8859-1.convmv --list покажет вам список известных (для вашей системы) кодировок.Поскольку приведенная выше команда показывает только то, что она может делать, можно безопасно запускать несколько раз с разными кодировками, пока не найдете тот, который работает для всех файлов .

Если это шрифтпроблема, мы должны разобраться в этом

1 голос
/ 25 мая 2011

Неожиданные знаки вопроса, знаки в спале и т. Д. В строке являются признаком того, что что-то где-то не распознает определенный символ при преобразовании из одного набора символов в другой.

В вашем случае проблема может возникнуть в нескольких местах:

  • Это может произойти, когда ваша Java-программа читает имена файлов из каталога (в вызове dir.listFiles()).

  • Это может происходить при печати символов в потоке консоли.

В любом случае основной причиной, скорее всего, является несоответствие между тем, что, по мнению Java, должны быть настройками языкового стандарта и параметрами, которые используют операционная система и / или командная оболочка.

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

Второй эксперимент, который необходимо выполнить, - это изменить вашу Java-программу так, чтобы она выводила одну из проблемных строк в виде последовательности чисел, представляющих коды символов для каждого из символов. Вы видите коды символов для ASCII / Unicode '?'.

1 голос
/ 25 мая 2011

Кодировка содержимого имени файла не имеет ничего общего с кодировкой самого имени файла.

Вы должны получить правильные результаты от System.out.println(insert)

Если вы этого не сделаете, это означает, что оболочка имеет другую кодировку символов, которая не является кодировкой символов по умолчанию для вашей системы (это случается редко; обычно это является результатом явной команды для переключения кодировок в оболочке).

Если имена файлов отображаются правильно при перечислении каталога в оболочке, я ожидаю, что они будут отображаться правильно без указания кодировки в вашей Java-программе.


Если оболочка не способна отображать символ (он заменяет символ замены 0xFFFD (& # xFFFD;) на эти непечатаемые символы), вы ничего не можете сделать из своего Java-приложения, чтобы изменить это. Вам нужно изменить кодировку символов терминала, установить правильные шрифты и т. Д .; это проблема операционной системы, а не проблема Java.

В то же время, даже если ваш терминал не может отображать правильные результаты, Java-программа должна правильно обрабатывать кодировки символов без вашего вмешательства.

Библиотека API File определяет правильную кодировку символов для вашей системы и выполняет необходимое декодирование в символы. Аналогично, драйвер базы данных должен согласовать с базой данных определение правильной кодировки и выполнить любое необходимое кодирование в байтах от имени вашего приложения.

0 голосов
/ 25 мая 2011

В Java 1.6 вы можете использовать System.console () вместо System.out.println () для отображения акцентированных символов на консоли.

public class Test {
  public static void main(String args[]){
   String s = "caractères français :  à é \u00e9"; // Unicode for "é"
   System.console().writer().println(s);
  }
}

, и вывод будет

C:\temp>java Test
caractères français :  à é é
0 голосов
/ 25 мая 2011

В комментарии вы написали:

@ mdrg: ну, это проблема.Я должен прочитать имена файлов, а затем положить их в базу данных.И там много "?", это не должно быть ... - Лисси 27 минут назад

Я предполагаю, что столбец, в который вы вставляете имена файлов, задает US-ASCII в качестве кодировки и заменяет символы вне этого диапазона заменойсимвол, который в вашем случае является вопросительным знаком.

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

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