Я ожидаю, что это связано с тем, как ваш терминал интерпретирует вывод.
Как было указано выше, все глифы нот являются многобайтовыми символами. Кроме того, Java char
имеет ширину всего 16 бит, поэтому один char
не может надежно представлять один символ Unicode сам по себе - и, следовательно, метод String.substring
не полностью поддерживает многобайтность.
Таким образом, скорее всего, при каждой итерации цикла Java выводит как бы полсимвола. Когда печатается первый байт пары, терминал понимает, что это первая половина многобайтового символа, и не отображает его. Когда печатается следующий байт, терминал видит полный символ, соответствующий ноте, и отображает его.
Что происходит, когда вы раскомментируете println("\r")
, так это то, что вы вставляете новую строку в середине двух половинок каждого символа. Таким образом, терминал никогда не получает последовательность байтов, например. 0x26, 0x6C, представляющий примечание, но вместо этого получает 0x26, 0x10 , 0x6C, 0x10 поэтому заметка не отображается.
person
Andrzej Doyle
schedule
20.11.2009
\u000d
работает лучше?System.out.print('\u000d');
илиSystem.out.print("\u000d");
- person VonC   schedule 20.11.2009