Java: обнаружение неотображаемых символов для заданной кодировки символов - PullRequest
3 голосов
/ 01 сентября 2010

В настоящее время я работаю над приложением для проверки и анализа CSV-файлов.Файлы CSV должны быть закодированы в UTF-8, хотя иногда мы получаем файлы в ложной кодировке.CSV-файлы, скорее всего, содержат специальные символы немецкого алфавита (Ä, Ö, Ü, ß), так как большинство текстов в файле CSV написаны на немецком языке.

Для части валидатора, iнужно убедиться, что файл в кодировке UTF-8.Пока нет специальных символов, скорее всего, нет проблем с синтаксическим анализом.

До сих пор я пытался прочитать файл как байты и использовать некоторые библиотеки для обнаружения (или предположения) кодировки,Я попробовал большинство возможностей этого поста: http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

Но все библиотеки, которые я пробовал, не возвращали правильную кодировку, и поэтому я не мог разобрать специальные символы.

Теперьмой вопрос: есть ли способ определить для данной кодировки символов, такой как UTF-8, чтобы обнаружить символы, которые не закодированы правильно?Таким образом, в основном символы, которые отображаются в консоли (Eclipse) в виде вопросительных знаков.

Или есть какой-либо другой способ правильно определить кодировку символов?Мне просто нужно знать, UTF-8 или нет.

Спасибо всем заранее за помощь!:) 1014

С наилучшими пожеланиями, Роберт

Ответы [ 2 ]

6 голосов
/ 01 сентября 2010

Последовательности байтов, которые не могут быть правильно декодированы, будут заменены на «символ замены», \uFFFD, который отображается следующим образом: �.Однако, если устройство вывода не поддерживает этот символ, оно может вместо этого использовать знак вопроса (?).

Таким образом, после декодирования данных UTF-8 в объекты String ищите вхожденияиз \uFFFD.

В качестве альтернативы, если вы настроите InputStreamReader с экземпляром CharsetDecoder, который вы создаете сами, вы можете получить гораздо больший контроль.Например, вы можете указать, что если какие-либо последовательности байтов, которые не могут быть декодированы, должны быть вызваны Exception.Или вы можете игнорировать их.Или вы можете указать другой символ в качестве символа замены.

2 голосов
/ 01 сентября 2010

Если текст на немецком языке и кодировка не UTF-8, это, вероятно, windows-1252.Или что-то совместимое с Windows-1252, например, ISO-8859-15.В таком случае GuessEncoding от Laforge - это все, что вам нужно.Я использовал это немного, и у меня никогда не было проблем, и это работает почти исключительно с английским текстом;Немецкий должен быть еще легче обнаружить.

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

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