Чтение строк текста в неизвестной кодировке - PullRequest
3 голосов
/ 06 июля 2011

Мне нужно построчно читать текстовый файл и применять к каждому из них несколько CharsetDecoders по порядку. На самом деле, я сначала пытаюсь декодировать строку, как если бы она была в кодировке UTF8, и возвращаться к однобайтовой кодировке, если UTF8 CharsetDecoder вызывает MalformedInputException.

Однако, если я использую InputStreamReader со значением по умолчанию или указанным набором символов, функция readLine автоматически заменяет на '?' все байты, которые он считает недопустимыми для указанной кодировки.

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

Есть ли способ заставить Java читать строки, не касаясь байтов?

UPDATE: Я обнаружил, что есть наборы символов, в которых все 256 байтов действительны, два из них являются ограничителями строки. Так что можно читать необработанный поток байтов line by line. Примеры таких кодировок:

IBM00858 IBM437 IBM775 IBM850 IBM852 IBM855 IBM860 IBM861 IBM862 IBM863 IBM865 ibm866 ISO-8859-1 ISO-8859-13 ISO-8859-15 ISO-8859-2 ISO-8859-4 ISO-8859-5 ISO-8859-9 KOI8-R KOI8-U окна-1256

Вопрос сейчас закрыт.

1 Ответ

0 голосов
/ 06 июля 2011

Вы не можете использовать класс считывателя и не ожидать его декодирования базового потока байтов.Если у вас есть файл, в котором каждая строка закодирована в отдельном наборе символов (?), То вам лучше разработать метод определения базовой кодировки символов.Возможно, вы можете использовать детектор кодирования, такой как juniversalchardet .

...