Проблемы с кодировкой во встроенном программном обеспечении c

#character-encoding

#кодировка символов

Вопрос:

Я работаю над проектом EDK для ПЛИС Xilinx Spartan 6. Существует микропроцессорная система с микропроцессором Microblaze, реализованным в FPGA.

Он имеет графическое ядро с собственным пространством памяти для отображения текста, указанного в программном коде, выполняемом Microblaze. Связанная таблица ASCII содержит 256 символов.

Программное обеспечение извлекает текст по интерфейсу RS232. Все в порядке при отображении английского текста (0-127), потому что английские символы одинаковы практически в любой кодировке. Но при попытке отобразить русский язык мое программное обеспечение не может связать соответствующие коды ASCII с этими символами.

Как я должен анализировать текст из rs232, чтобы соответствовать интервалам 0-255 ASCII?

Комментарии:

1. Каков формат текста, поступающего по интерфейсу RS232? Насколько мне известно, ASCII и расширенный ASCII не могут отображать русский язык. Кодовые страницы — это Windows. Если программное обеспечение не выдает вам UTF8 / 16 / 32, значит, оно не русское.

2. Кроме того, каковы варианты отображения текста? Если это не совместимо с UTF, то вы все равно не сможете отображать русский язык.

3. @MooingDuck Текст поступает в текстовом формате RAW, дополнительный протокол через RS232 не используется. Я просто отправляю последовательность символов из источника и анализирую ее во встроенной целевой системе. Pcore для отображения текста разработан мной. Я вручную организовал блочные ОЗУ FPGA в качестве текстовой памяти (например, текстовый режим 80×40 в старых системах DOS). Я также организовал другое количество BRAMS в качестве ПЗУ для шрифтов для хранения 256 символов изображений консольного шрифта 8×16 (сделанных из кириллического файла шрифта PSF). чтобы отобразить символ на экране, мне нужно всего лишь установить байт текстовой памяти с помощью процессора Microblaze.

4. Весь текст имеет формат. Единственный формат, который вы упомянули до сих пор, — ASCII, который определен только для 0-127. Поскольку вы говорите, что это 0-255, я должен предположить, что ваш ввод использует кодовую страницу Windows для остальных 128 (Марк говорит, что кодовая страница 1251, кириллица) Я бы также предположил, что ваш вывод не соответствует кодовой странице ввода.

Ответ №1:

Вам нужно знать кодировку символов, используемую вашим источником — RS232 — это просто метод перемещения битов, он не определяет какую-либо кодировку. Например, исходная Windows? Если это так, символы могут быть либо в Юникоде (UTF-8), либо на кодовой странице 1251. Как только вы узнаете эту кодировку, вам нужно будет перевести каждый символ, вероятно, используя таблицу поиска объемом 256 байт. Если источник использует несколько байтов для некоторых символов, как это делает UTF-8, вам сначала нужно собрать байты в код символа, прежде чем вы сможете выполнить поиск.

Комментарии:

1. Также возможно (хотя и маловероятно) использовать UTF-16. Кроме того, если функция вывода принимает то же, что и вход, ему не нужно выполнять поиск.

2. @MooingDuck, вы правы, это может быть UTF-16, но если бы это было так, я бы ожидал, что это уже появилось с выводом ASCII. Я также предполагаю, что требуется сопоставление, иначе этот вопрос не был бы задан.

3. @Mark Ransom Я бы хотел быть независимым от исходной ОС. Это может быть Windows, Mac или Linux. Не знаю точно, какая кодировка используется, но при тестировании с английскими символами все работало как шарм в любой ОС. Как я могу определить кодировку, необходимую для передачи информации из источника? Должен ли я стандартизировать его вручную между исходными операционными системами?

4. @AndreyPesoshin, вы не можете быть независимыми от исходной ОС, потому что расширенные символы зависят от ОС и настроек. Английские символы ASCII стандартизированы и работают везде, как вы заметили, но то же самое нельзя сказать о русских символах. Опубликуйте некоторый текст и его шестнадцатеричный дамп в вашем вопросе, может быть, мы сможем разобраться в этом для вас.

5. @MarkRansom Спасибо, сделаю это в ближайшее время