Почему System.out.charset() не равен stdout.encoding

Моя операционная система — Windows 10, а кодовая страница системы по умолчанию — GBK. Версия JDK — 21, а версия Gradle — 8.5. Я использую chcp 1252 для изменения кодировки консоли. Чтобы проверить System.out.charset процесса демона gradle, я использую System.out.print(System.out.charset()) в build.gradle, это «utf-8», а свойство VM stdout .encoding процесса демона Gradle — 1252. Если я запускаю файл класса, который выводит System.out.charset с помощью команды Java, выходные данные System.out.charset и stdout.encoding будут равны 1252. Почему вывод демона Gradle не равно stdout.encoding?

что я пробовал: Сначала я думал, что это потому, что stdout.encoding не поддерживает указанный мной набор символов. Однако запуск файла класса, который выводит System.out.charset напрямую с помощью команды Java, показывает, что указанный мной набор символов поддерживается. Я ожидал, что System.out.charset должен равняться stdout.encoding. Пожалуйста, простите меня за мой плохой английский.

Как вы устанавливаете кодировку? И почему вы ожидаете, что кодировка Gradle будет соответствовать кодировке приложения Java?

dan1st 06.07.2024 20:50

В чем же настоящая проблема, какова ЦЕЛЬ?

g00se 06.07.2024 22:10

@dan1st Никаких других настроек кодировки, кроме использования chcp для установки консоли на 1252. По умолчанию system.out.charset должно быть равно свойству jvm stdout.encoding. Но почему они не равны в процессе демона gradle? Изменил ли демон gradle System.out?

ok im 07.07.2024 02:22

Помогает ли установка системного свойства демона stdout.encoding?

Slaw 07.07.2024 04:11

@Slaw Это не работает, что бы я ни указывал, System.out.charset по-прежнему UTF-8

ok im 07.07.2024 05:24

Настройки вашего демона Gradle не зависят от настроек вашего приложения. Если вы хотите изменить некоторую кодировку в своем приложении, вам нужно изменить аргументы JVM приложения, а не аргументы JVM демона Gradle.

dan1st 07.07.2024 07:49

Возможно, было бы неплохо предоставить минимально воспроизводимый пример.

Slaw 07.07.2024 08:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В конечном итоге найденный в исходном коде gradle, gradle изменяет выходной поток с помощью System.setOut, поэтому System.props "stdout.encoding" не соответствует System.out.charset(). Кроме того, gradle также изменяет «stdout.encoding» в Sytem.props, что приводит к несоответствию с кодировкой консоли.

Другие вопросы по теме