java.nio.charset.MalformedInputException при чтении потока - PullRequest
9 голосов
/ 30 июля 2011

Я использую следующий код для чтения данных.Выдает java.nio.charset.MalformedInputException.Файл, который я могу открыть в обычном режиме, но он содержит символы не ascii.В любом случае, я могу решить эту проблему?

  Source.fromInputStream(stream).getLines foreach { line =>
    // store items on the fly
    lineParser(line.trim) match {
      case None => // no-op
      case Some(pair) => // some-op
    }   
  }   
  stream.close()

Код построения потока здесь:

def getStream(path: String) = {
  if (!fileExists(path)) {
    None
  } else {
    val fileURL = new URL(path)
    val urlConnection = fileURL.openConnection
    Some(urlConnection.getInputStream())
  }
}

Ответы [ 2 ]

15 голосов
/ 30 июля 2011

Попробуйте Source.fromInputStream(stream)(io.Codec("UTF-8")) или любую другую кодировку, которая вам нужна.

5 голосов
/ 01 августа 2011

Жан-Лоран, вероятно, совершенно прав, что Stream.fromInputStream использует кодировку, которая не соответствует вашему потоку - вероятно, платформу по умолчанию, то есть ISO8859-1 в Windows, UTF-8 в последних дистрибутивах Linux, IIUC MacRoman на Mac.... Так как вы получили исключение кодирования, вполне вероятно, что оно по умолчанию было UTF-8, поскольку это довольно жесткая схема, а файл представлял собой другую кодировку (скорее всего ISO8859-1).

В широком смысле априори нельзя сказать, какое кодирование символов использовалось для генерации некоторого потока битов - вам необходим какой-то внеполосный механизм для его передачи.В случае HTTP-ответов вы часто можете получить его из заголовка Content-Type, но различные веб-приложения иногда делают это неправильно.Если файл представляет собой XML, обычно указывается кодировка в Инструкции обработки в верхней части.Некоторые форматы файлов задают единую стандартную кодировку ... Это действительно по всей карте.

В отсутствие каких-либо требований к интеграции лучше всего использовать везде явное использование UTF-8 и не полагаться на кодировку платформы по умолчанию.

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