Как исправить мошеннический вывод смайликов в Arduino IDE 2?
У меня есть относительно простой код, печатающий некоторые смайлики:
void loop() {
// put your main code here, to run repeatedly:
Serial.println("Hello world ❤♀️♂️✔");
}
На случай, если это не очень хорошо отображается, вот изображение того, как это выглядит в Arduino IDE 2.0.3:
Однако серийный монитор иногда отображает эмодзи, а иногда нет. Оно варьируется от строки к строке следующим образом:
Hello world �����������������♀�������♂️✔����
Hello world ���������������♀️♂️✔
Hello world ��❤���������������������������������♂���✔
Hello world ❤��������������������
Hello world �������♀️��������������✔����
Hello world ��������������♀��������️�����������
Hello world ��❤���������������������♂�������✔���
Опять же, вот как это выглядит на моем компьютере с Windows 10:
Я убедился, что это не ошибка скорости передачи данных. И Arduino, и ПК настроены на 9600.
В Arduino IDE 1 выходные данные не красочны, а некоторые смайлики вообще не отображаются, но результат гораздо более последовательный:
Как исправить зашифрованный вывод в Arduino IDE 2?
@Thomas Weller, 👍2
Обсуждение1 ответ
Лучший ответ:
Это проблема Arduino IDE 2.0.3. Об этом сообщается как проблема 589 и выпуск 1405.
Ошибка была исправлена 9 декабря 2022 г. [PR], и я могу подтвердить, что она исправлена в ночная сборка 2.0.4-221229.
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Чтобы было ясно, это проблема с обработкой _любой_ многобайтовой кодировки UTF-8 и, возможно, еще одна проблема вдобавок к этой проблеме с обработкой кластеров графем. Когда я впервые столкнулся с этим, я думаю, что это было при использовании символа градуса для показания температуры (кодовая точка 0xB0), который кодируется в UTF-8 как 0xC2 0xB0. Ваши шансы увидеть символ правильно увеличиваются, если вы используете
Serial.flush()
и ждете некоторое время до и после многобайтовых кодировок и не задерживаетесь в середине. Другими словами, увеличивается вероятность того, что Serial Monitor получит всю последовательность UTF-8 в одном буфере., @timemage