读取流时出现java.nio.charset.MalformedInputException异常

9

我使用以下代码读取数据,但是它抛出了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

尝试使用 Source.fromInputStream(stream)(io.Codec("UTF-8")) 或者你需要的字符集。


1
谢谢你的解决方案。现在的问题是,我得到的是“?”而不是变音符号:/ - Steven

5
Jean-Laurent很可能是完全正确的,Stream.fromInputStream正在使用与您的流不匹配的编码,很可能是平台默认值,在Windows上是ISO8859-1,在最近的Linux发行版上是UTF-8,在Mac上是MacRoman......由于您收到了编码异常,因此很可能它默认为UTF-8,因为它是一个相当严格的方案,而文件则是其他编码(最可能是ISO8859-1)。
广义上讲,没有办法事先判断生成某个比特流所使用的字符编码——您需要一些带外机制来进行通信。对于HTTP响应,您通常可以从Content-Type标头中获取它,但有时各种Web应用程序都做错了。如果文件是XML,则在顶部的处理指令中声明编码是常见的。某些文件格式指定了单个标准编码...这真的是五花八门。
在没有任何集成要求的情况下,您的最佳选择是明确使用UTF-8,并且不依赖于平台默认编码。

3
我在尝试显式使用UTF-8时,仍然无法访问google.com。 - Brice Favre

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接