读取流时java.nio.charset.MalformedInputException

use*_*384 9 scala stream utf-8 utf-16 decoding

我使用以下代码来读取数据.它抛出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()
Run Code Online (Sandbox Code Playgroud)

流构造代码在这里:

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

huy*_*hjl 15

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


Ale*_*ise 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,并且不依赖于平台默认编码.

  • 我试图让google.com明确使用UTF-8时出现问题. (3认同)