读取流时java.nio.charset.MalformedInputException

时间:2011-07-30 19:14:42

标签: scala utf-8 stream decoding utf-16

我使用以下代码来读取数据。它抛出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 个答案:

答案 0 :(得分:15)

尝试Source.fromInputStream(stream)(io.Codec("UTF-8"))或您需要的任何字符集。

答案 1 :(得分:5)

Jean-Laurent可能完全正确,Stream.fromInputStream正在使用与您的流不匹配的编码 - 可能是平台默认值,即Windows上的ISO8859-1,最新Linux发行版上的UTF-8,Mac上的IIUC MacRoman ...由于你有一个编码异常,它很可能是默认为UTF-8,因为它是一个相当严格的方案 - 而且该文件是其他编码(很可能是ISO8859-1)。

从广义上讲,没有办法告诉先验使用什么字符编码来生成一些比特流 - 你需要一些带外机制来进行通信。对于HTTP响应,您通常可以从Content-Type标头获取它,但有时各种Web应用程序都会出错。如果文件是XML,则通常在顶部的处理指令中声明编码。一些文件格式指定了单个标准编码......它真的遍布地图。

在没有任何集成要求的情况下,最好的选择是在任何地方明确使用UTF-8,并且不依赖于平台默认编码。