- 
                Notifications
    You must be signed in to change notification settings 
- Fork 41.6k
Description
JEP 400: UTF-8 by Default was included in Java 18 and later version. Basically it changes the default file.encoding to UTF-8 by default and introduced a few additional properties to identify system native encoding. However the console output charset is different:
Those APIs include the ones listed above, but not System.out and System.err, whose charset will be as specified by Console.charset().
However Spring Boot doesn't respect Console.charset(). It always use org.springframework.boot.logging.LoggingSystemProperties.getDefaultCharset() to set the default charset for console and file encoding. Depends on the implementation, it uses either hard-coded UTF-8 or Charset.defaultCharset().
Below is a simple Spring Boot application to reproduce the issue (The system locale needs to be different than English):
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
        System.out.println("你好");
        log.info("你好");
    }Run it with Java 17:
你好
2024-11-12T10:16:10.992+08:00  INFO 19176 --- [test] [           main] test.Application           : 你好
Run it with Java 21 (my system locale is GBK):
你好
2024-11-12T10:16:28.478+08:00  INFO 524 --- [test] [           main] test.Application           : 浣犲ソ
The workaround is to add properties like below. But I think a better value should be provided by default.
logging.charset.console=${stdout.encoding}