【问题标题】:sbt test encoding issuesbt 测试编码问题
【发布时间】:2018-02-26 10:16:14
【问题描述】:

我有一个与sbt test encoding hickup 非常相似的问题,但由于答案不适用而且我的案例是 Scala 代码,所以我在这里问。

我在单元测试中有一个包含非 ASCII 字符的字符串。此测试在 Linux 上运行良好,从 IntelliJ 运行时在 Windows 上运行良好。但是,当使用sbt test 从 Windows shell 运行时,它们会失败。如果我打印字符串humanité,它在失败的情况下显示为humanitΘ。文件编码为 UTF-8。

println(new java.io.InputStreamReader(System.in).getEncoding) 从 IntelliJ 运行时返回 UTF8,从 shell 运行时返回 Cp1252。我尝试了各种方法来更改编码:

  • 运行sbt "-Dfile.encoding=UTF-8" test
  • 检查我的 build.sbt 中定义的 scalacOptions 是否包含“-encoding”、“UTF8”

但默认编码始终是Cp1252(也许这很正常?)并且测试一直失败。

失败的代码如下:

val stringToEncrypt = "l'humanité"
println(test)

从 IntelliJ 我得到:

l'humanité

从运行 sbt 的 windows shell:

l'humanitΘ

【问题讨论】:

  • 你在使用 Source.fromInputStream 吗?
  • 我在我的项目中的某个地方使用它,但不是在我认为的测试路径中。
  • 消费流时需要显式设置编码,suc
  • 不幸的是,我的问题不在使用这种方法的流程中。

标签: scala utf-8


【解决方案1】:

为了避免 OS 的默认字符集出现问题,您可以在创建 InputStream 时显式传递所需的字符集:

new java.io.InputStreamReader(System.in,"UTF-8")

【讨论】:

  • 带有 InputStreamReader 的代码只是在这里指出我的编码问题。根本问题是,在编译我的 scala 源代码时,从 shell 运行时看起来 sbt 没有选择正确的编码。
  • 我们发现要避免这种情况,最好的办法是显式传递编码:我们在使用 docker 运行测试时遇到了这个问题
  • 不知道你的意思,你如何指定你创建的字符串的编码?
  • 我不确定我理解你的意思,我会加强问题以使其更清楚。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
相关资源
最近更新 更多