【问题标题】:Comparing two strings works on windows but fails on linux比较两个字符串在 Windows 上有效,但在 linux 上失败
【发布时间】:2017-07-09 17:22:09
【问题描述】:

我编写了一个单元测试,它控制德语字母(ä、ö、ß 等)是否存在任何编码问题

@Test
public void testBodyWithDefaultCharset() throws UnsupportedEncodingException {
    when(backendDefinition.getProperty(BackendDetailsEnum.MAIL_CHARSET.getName())).thenReturn(null);
    Charset defaultCharset  = Charset.defaultCharset();
    when(packet.getPayload()).thenReturn(defaultCharset.encode("ÄÖÜäöüß").array());

    final String mailText = classUnderTest.prepareMailText(backendDefinition, packet);

    assertThat(mailText, is(equalTo("ÄÖÜäöüß")));
}

此测试在 windows pc 中通过,但在 jenkins 上失败,这是一个 linux 环境。错误信息如下;

Expected: is "ÄÖÜäöüß"
but: was "???????"

我的问题是,将 mailText 与“ÄÖÜäöüß”进行比较是否有误?我认为比较两个字符串时不需要说明任何编码。

【问题讨论】:

  • Charset.defaultCharset() 听起来很可疑。你能选择 UTF-8 吗?
  • 默认字符集在 unix 和 windows 之间可能会有所不同,我希望 windows 是 ISO-1250 (Windows) 但我真的不知道在 unix 上会出现哪一个...你可以尝试使用 UTF- 8 ?
  • 两个环境中的默认字符集可能不同,因此结果不同。

标签: java unit-testing character-encoding


【解决方案1】:

可能是您的文件编码和内容在 Windows 和 Linux 上的定义不同?听起来像是文件编码的不同。

您可以尝试在 .bashrc 中显式设置编码,或者在 Linux 中使用locale-程序(以 UTF-8 为例):

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

输出是什么:

locale?

与预期的有什么不同?

还要检查defaultCharset() 使用的是哪个字符集。尝试在 Windows / Linux 上输出值。

【讨论】:

    【解决方案2】:

    我已将断言行更改如下,并且有效。

    assertThat(mailText, is(equalTo(new String("ÄÖÜäöüß".getBytes(defaultCharset)))));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多