gpt4 book ai didi

java - 如何修复这个(大概)与编码相关的错误(Java、Gradle)?

转载 作者:行者123 更新时间:2023-12-02 02:27:59 28 4
gpt4 key购买 nike

我有以下方法,它将字符串截断为特定大小(以字节为单位):

public class Utils {
public static String trimStringToBytesSize(String s, int length) {
if (s == null || length < 0) return null;
int trimLength = Math.min(length, s.length());
String trimmedString = s;
while (trimmedString.getBytes().length > length && trimLength >= 0) {
trimmedString = s.substring(0, trimLength);
trimLength--;
}
return trimmedString;
}
}

我为它编写了一些测试:

@Test
public void trimStringToBytesSize() {
[...]
trimStringToBytesSizeTestLogic("Шалом",
6,
"Шал"
);
[...]
}

private void trimStringToBytesSizeTestLogic(final String input, final int
stringLength, final String expectedResult) {
final String actRes = Utils.trimStringToBytesSize(input, stringLength);
Assert.assertEquals(expectedResult, actRes);
}

此测试在 IntelliJ Idea 中运行良好。但是,当我在 Gradle 中运行它时,它失败了。错误是这样的:

org.junit.ComparisonFailure: expected:<Шал[]> but was:<Шал[ом]>

显然,它与字节大小有关。

我尝试在 minimal project 中重现该问题,其中包含方法和测试。代码是相同的,但是原始代码中出现的问题不会出现在这个最小的项目中。

我试图找出它们之间的区别,并比较最小项目和原始项目中的编码。根据 Notepad++ (UTF-8),它们是相同的。

还有什么可能导致此测试失败?我该如何修复它?

注意:我使用的是 Java 1.8 和 Gradle 2.14(由于客户的要求,我无法升级到更新的版本)。

最佳答案

你是对的,字符串的字节大小在很大程度上取决于你使用从字符串生成字节的编码。当您使用不带参数的 String.getBytes() 时,将使用默认编码。在 *nix 系统上为 UTF-8,在 Windows 系统上为“ISO-8859-1”。

您的 UTF-8 字节字符串 Шалом[-48, -88, -48, -80, -48, -69, -48 ,-66,-48,-68]
ISO-8859-1 字节中的字符串 Шалом[63, 63, 63, 63, 63] ,它实际上是 ? ????,因为您的字符无法用 ISO-8859-1 进行编码。

因此,当您的测试成功时,您将使用 UTF-8 作为编码,如果测试失败,您将使用 ISO-8859-1 作为编码,其中只有 5 个字节,因此弦没有被触及。

在没有指定显式编码的情况下,您几乎不应该使用诸如 String getBytes()new String() 之类的方法,否则您在不同的操作系统或环境中总是会有不同的行为不同的上下文。

关于java - 如何修复这个(大概)与编码相关的错误(Java、Gradle)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47550283/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com