从cmd和Spring Tools Suite启动时,Java中字符串的不同编码



我正在用Windows 10 Pro German Edition开发一个带有春季启动功能的网络应用程序。作为IDE,我使用的是Spring Tool Suite。当我用maven:从控制台启动应用程序时

mvn clean package -Pproduction && mvn spring-boot:run -Dfile.encoding=UTF8

并且我调用字符串";Jürgen";string.toCharArray((并显示它将打印的所有字符:

长度:6
pos:0,val:J
pos:1,val:³
pos:2,val:r
pos:3,val.g
pos:4,val.e
pos:5,val:n

但是,当我通过引导面板在Spring Tool Suite IDE中启动应用程序时(右键单击重新启动(

它将打印以下内容:
长度:6
位置:0,val:J
位置:1,val:ü
地址:2,val:r
地址:3,val:g
地点:4,val:e
地点:5,val:n

我也想要控制台中STS的行为?但是怎么做呢?为什么我会有这个问题?该值将正确显示在GUI中。只有输出不同。

Windows控制台编码不是来自Java属性,而是Windows配置或IDE配置的一部分。因此产生了差异。最大的问题是数据是正确的,只是显示不正确,还是数据本身被破坏了。为此,我建议将您的String转换为unicode序列,它会显示数据iteslf是否完整。为此,我编写了自己的util,将String转换为Unicodes的序列,反之亦然。代码可能看起来像这样:

private static void encodingTest() {
String testStr1 = "Jürgen";
String encoded1 = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(testStr1);
String restored = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(encoded1);
System.out.println(testStr1 + "n" + encoded1 + "n" + restored);
}

输出(对于完整数据(如下所示:

Jürgen
u004au00fcu0072u0067u0065u006e
Jürgen

StringUnicodeEncoderDecoder类是我编写和维护的开源MgntUtils库的一部分。这是它的JavaDoc。如果你想使用MgntUtils库,可以在Maven central或Github上找到它作为Maven工件(带有源代码和Javadoc(。你也可以得到类似的结果,代码像这样以及

System.out.println(arg.chars().mapToObj(c -> String.format("\u%04x", c)).collect(Collectors.joining()));

您面临一个mojibake案例(Python中的示例,因为其通用可理解性(:

print( 'Jürgen'.encode('cp1252').decode('cp850'))
J³rgen

我猜您的命令提示符默认代码页是850。使用chcp.com检查如下:

chcp
Active code page: 850

解决方案:在运行mvn之前将代码页更改为cp1252,如下所示:

chcp 1252
mvn clean package -Pproduction && mvn spring-boot:run -Dfile.encoding=UTF8

最新更新