如何修复这个(可能是)编码相关的错误(Java、Gradle)?

如何修复这个(可能是)编码相关的错误(Java、Gradle)?,java,gradle,encoding,automated-tests,gradle-2,Java,Gradle,Encoding,Automated Tests,Gradle 2,我有以下方法,它将字符串截断为以字节为单位的特定大小: 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 trimmed

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

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;
    }
}
这个测试在IntelliJ Idea内部运行良好。然而,当我在Gradle中运行它时,它失败了。错误是:

org.junit.ComparisonFailure: expected:<Шал[]> but was:<Шал[ом]>
org.junit.ComparisonFailure:应为:但为:
显然,这与字节大小有关

我试着在一个包含方法和测试的表格中重现这个问题。代码是相同的,但是在原始代码中出现的问题没有出现在这个最小的项目中

我试图找出它们之间的差异,并比较了minimal项目和原始项目中的编码。根据记事本++(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,63]
,实际上是
??
,因为您的字符不能在
ISO-8859-1
中编码

因此,当您的测试成功时,您使用
UTF-8
作为编码,如果测试失败,您使用
ISO-8859-1
作为编码,其中只有5个字节,因此不会触碰字符串


如果不指定显式编码,您几乎不应该使用
String getBytes()
new String()
之类的方法,或者您在不同的操作系统或不同的上下文中总是有不同的行为。

您是对的,字符串的字节大小在很大程度上取决于使用的编码,从字符串生成字节。当您使用不带参数的
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,63]
,实际上是
??
,因为您的字符不能在
ISO-8859-1
中编码

因此,当您的测试成功时,您使用
UTF-8
作为编码,如果测试失败,您使用
ISO-8859-1
作为编码,其中只有5个字节,因此不会触碰字符串

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

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