我正在用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