0

我有一个具有以下内容的 Java 类:

public static final blob COPYRIGHT_MARK = new Blob("div.legal_footer span", "© " + new SimpleDateFormat("yyyy").format(new Date()) + " Acme LLC. All Rights Reserved.");

具有该类的项目存储在 git 存储库中,并由 Jenkins 作业拉取以运行单元测试。当文件被拉入 Jenkins 作业工作区时,会在字符串中的版权符号之前注入一个字符:

public static final blob COPYRIGHT_MARK = new Blob("div.legal_footer span", "© " + new SimpleDateFormat("yyyy").format(new Date()) + " Acme LLC. All Rights Reserved.");

这导致测试失败。

java 类被编码为 UTF-8。可以在本地构建项目并在本地运行测试,没有任何问题。Jenkins 实例在 OSX 上运行。代码也是在 Mac 上编写的。

我很难理解为什么文件在拉入工作区时会被更改。

关于检查什么的任何建议?

4

1 回答 1

4

您需要在一些配置文件/参数/环境变量中声明要使用的编码是 UTF-8。将文件物理编码为 UTF-8 只是成功了一半,文件的任何读者也需要了解这一事实。


没有字符注入,mojibake 也包含版权字符只是一个巧合。

您已将文件编码为 UTF-8,因此实际上它具有以下字节:

0xC2 0xA9

当该文件的读者知道将该文件解释为 UTF-8 时,该字符©将正确显示。

但是,如果该文件的阅读者不知道用什么编码来解释该文件,则很可能会被错误地解释。

在您的情况下,该文件可能被错误地解释为 Windows-1252/cp1252/"ANSI" 或 ISO-8859-1。在这些编码0xC2 0xA9©,所有其他字节都解码为与 UTF-8 中相同的字符——这又是一个巧合。如果您只使用具有相同编码映射的字符,您甚至不会注意到有问题。

每个软件开发人员绝对、绝对必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2013-04-05T12:27:51.507 回答