diff --git a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationBannerPrinter.java b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationBannerPrinter.java index 4e744703e74..b525d819723 100644 --- a/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationBannerPrinter.java +++ b/spring-boot-project/spring-boot/src/main/java/org/springframework/boot/SpringApplicationBannerPrinter.java @@ -20,6 +20,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; +import java.nio.charset.StandardCharsets; import org.apache.commons.logging.Log; @@ -95,9 +96,11 @@ class SpringApplicationBannerPrinter { private String createStringFromBanner(Banner banner, Environment environment, Class mainApplicationClass) throws UnsupportedEncodingException { + String charset = environment.getProperty("spring.banner.charset", StandardCharsets.UTF_8.name()); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - banner.printBanner(environment, mainApplicationClass, new PrintStream(baos)); - String charset = environment.getProperty("spring.banner.charset", "UTF-8"); + try (PrintStream printStream = new PrintStream(baos, false, charset)) { + banner.printBanner(environment, mainApplicationClass, printStream); + } return baos.toString(charset); } diff --git a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java index 30a112e705d..d4e464f9efa 100644 --- a/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java +++ b/spring-boot-project/spring-boot/src/test/java/org/springframework/boot/SpringApplicationBannerPrinterTests.java @@ -16,12 +16,19 @@ package org.springframework.boot; +import org.apache.commons.logging.Log; import org.junit.jupiter.api.Test; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.predicate.RuntimeHintsPredicates; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.mock.env.MockEnvironment; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.then; +import static org.mockito.Mockito.mock; /** * Tests for {@link SpringApplicationBannerPrinter}. @@ -38,4 +45,15 @@ class SpringApplicationBannerPrinterTests { assertThat(RuntimeHintsPredicates.resource().forResource("banner.txt")).accepts(runtimeHints); } + @Test + void shouldUseUtf8() { + ResourceLoader resourceLoader = new GenericApplicationContext(); + Resource resource = resourceLoader.getResource("classpath:/banner-utf8.txt"); + SpringApplicationBannerPrinter printer = new SpringApplicationBannerPrinter(resourceLoader, + new ResourceBanner(resource)); + Log log = mock(Log.class); + printer.print(new MockEnvironment(), SpringApplicationBannerPrinterTests.class, log); + then(log).should().info("\uD83D\uDE0D Spring Boot! \uD83D\uDE0D\n\n"); + } + } diff --git a/spring-boot-project/spring-boot/src/test/resources/banner-utf8.txt b/spring-boot-project/spring-boot/src/test/resources/banner-utf8.txt new file mode 100644 index 00000000000..f3077be2fc5 --- /dev/null +++ b/spring-boot-project/spring-boot/src/test/resources/banner-utf8.txt @@ -0,0 +1 @@ +😍 Spring Boot! 😍