Как и при любой передаче текста, ваша Java-программа (писатель) и терминал (читатель) должны находиться на одной странице - то есть «кодовой странице» (кодировке символов).Вы сказали ASCII, но ASCII не поддерживает символы, которые вы хотите использовать.Вы, вероятно, думаете о CP437 из MS-DOS и Windows.(В MS-DOS не было кодовой страницы ASCII; для полноты из-за Windows у нее была одна поздняя версия. ASCII используется только в очень специализированных контекстах.)
Если вы хотите использовать транскодирование символов Javaвне уравнения вы можете записать байты в выходной поток.Тогда что бы они ни значили для терминала, он будет декодировать их в символы.
// for illustration purposes only; I would not invest in code like this.
System.out.flush();
System.out.write(0x03);
System.out.flush();
Чтобы увидеть их, терминал должен иметь шрифт, который включает в себя декодированный символ.Белая коробка или коробка с вопросительным знаком указывают, что шрифт не имеет.Знак вопроса или знак вопроса в черном ромбе указывают, что байты ничего не значат в кодировке символов терминала.
Чтобы проверить кодировку символов вашего терминала, перейдите на chcp
(Windows) или locale
(большинство других ОС).
Как указано в комментариях @VGR, GUI проще.Это потому, что они избегают концепции создания потока байтов текста в конкретной кодировке символов и просто используют средства оконной системы для рисования текста.(Это происходит за счет невозможности перенаправить вывод в другую программу или перенаправить его в файл, что является ключевой особенностью программ CUI.)