我使用以下代码来读取数据。它抛出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())
}
}
答案 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,并且不依赖于平台默认编码。