11.08.2017, 16:02
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Строку из UTF-8 в ANSI
Привет! Извиняюсь если эта тема была ранее. Помогите пожалуйста. У меня stm32f405. Работаю с ЖК дисплеем МЭЛТ. Фишка в том, что у него символы стоят в таблице на своём месте, только если использовать кодировку ANSI. Если UTF-8, то все не так например как в winstar. Есть конечно лёгкий путь, но он меня не устраивает. А заключается он в следующем: Я перекодировал файл в кодировку ANSI, далее в Keil выставил кодировку тоже ANSI. И когда я передаю строку
Код:
|
lcd2_send_string_xy(0,0, "Я русиш"); |
на дисплей выводится русский, но в самом редакторе, где кодю, вот это слово - Я русиш, оно каракулями. Я перевожу кеил в cp1251 и слово становится нормально видно, но на дисплее оно кривое. То есть я к тому что можно оставить и ANSI, но тогда я не буду видеть какой русский текст я пишу в редакторе. А так то всегда у меня в кеиле стоит utf-8. Так вот вопрос.... есть ли рабочая функция, или библа, которая хорошо переведёт символы строки char из UTF-8 в ANSI?
|
|
|
|
11.08.2017, 17:39
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Строку из UTF-8 в ANSI
Кодировка там в первых 128 символах таки ASCII, а вот что МЭЛТ использует для второй половины таблицы? KOI-8, CP866, EBCDIC? Это уже расширения ASCII на 8бит.
Алгоритмов море - но они универсальные (для полной UTF-8 ).
Берёте табличку для нужного множества из UTF-8 и за вечер пишете и отлаживаете сами.
Там все очень прозрачно. Возвращать два значения - символ и смещение к следующему значению в буфере - оно зависит от символа.
Описание кодирования даже в wiki нормально расписано.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 14.08.2017 в 01:20.
|
|
|
|
12.08.2017, 02:01
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Строку из UTF-8 в ANSI
Вобщем не знаю правильно ли так делать, но я выяснил, что надо просто от кода символа отнять число 848 и получится адрес который мне нужен в таблице дисплея. То есть 848 это то смещение. Но столкнулся вот с чем теперь.
Вот функцией вывода строки на экран
Код:
|
void lcd2_send_string_xy(uint8_t x, uint8_t y, wchar_t *str){
uint8_t st = 0, i = 0;
uint8_t symbol = 0;
TIM13-›CR1 &= ~TIM_CR1_CEN; //
st = x + 0x80;
if(y == 1){
st += 0x40;
}
lcd2_send_command(st);
delay_us(40);
while(str[i] != 0){
if(str[i] ›= 0xC0){
symbol = (str[i] - 0x350) & 0xFF;
lcd2_send_data(symbol);
}else{
lcd2_send_data(str[i]);
}
delay_ns(); //!!!!
i++;
}
} |
wchar_t я применил потому что символ русский у меня в utf-8 (2 байта).
А вот сам вывод:
Код:
|
wchar_t r_str[] = {0x042F};
int main(void){
SystemInit();
SystemCoreClockUpdate();
__enable_irq();
lcd2_ini();
lcd2_send_string_xy(0,0, r_str);
while(1){
__NOP();
}
} |
На экране всё отлично, но я бы хотел в редакторе писать вот так:
Код:
|
lcd2_send_string_xy(0,0, "Я"); |
А кеил ругается, если я так поставлю, он считает, что там всё-равно должно быть char * (ругается именно на эту строку на символ Я)
|
|
|
|
12.08.2017, 02:48
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Строку из UTF-8 в ANSI
нда, таких эпичных КОСТЫЛЕЙ я еще не видал...
PS для тех кто в танке - строки типа wchar_t начинаются с "L": L"Я"
Последний раз редактировалось Hives; 12.08.2017 в 02:55.
|
|
|
|
12.08.2017, 04:26
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Строку из UTF-8 в ANSI
supercelt, если завтра у Вас попадётся текст на фарси, китайском или иврите, то весь ваш алгоритм накроется тазиком.
В той же wiki вполне разжевана кодировка символов в UTF-8.
Надо проверять на допустимые символы, преобразовывать их в нужное, а для остальных (кроме первых 128 ) выводить тот же "?".
А в последнем примере и не получится - константа "не той системы"(c)
Нужна своя функция на место функции вывода на экран с проверкой и перекодировкой всего переданного буфера.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 12.08.2017 в 04:30.
|
|
|
|
12.08.2017, 08:11
|
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Строку из UTF-8 в ANSI
я не об этом, ну да ладно. вообще я считаю что ничему кроме 1251 не место в контроллерах: вполне достаточно 2 языков - русского для себя и аглицкого - для всех прочих. в итоге - расход памяти меньше, код быстрее, проще и стабильнее, и никаких глюков с конвертацией.
PS а китаезы и индусы пусть мучаются со своими каракулями.
|
|
|
|
12.08.2017, 11:52
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Строку из UTF-8 в ANSI
Hives, слишком категорично и явно не совпадает с кочкой зрения производителей. Вопрос ТС из той же серии. Тут легче выучить несколько английских слов и не парить себе мозг лишними проблемами. Как плюс - на экран ещё и больше данных влезет .
Кстати и 866, и KOI-8, тут явно универсальнее будут - на msmd свет клином совсем не сошёлся .
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
12.08.2017, 20:36
|
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Строку из UTF-8 в ANSI
Hives, может оно и так, но как я уже говорил, я сделал кодировку ср1251. В редакторе все видно, а на ЖК каракули. Переделал кодировку на ANSI, в итоге на ЖК всё норм, а что печатаю на русском в редакторе - не вижу.
|
|
|
|
12.08.2017, 21:13
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: Строку из UTF-8 в ANSI
А что для вас важнее - видеть напечатанное в редакторе (ваапще не проблема приписать //коммент или /*коммент*/) или нагрузить МК дополнительными вычислениями?
|
|
|
|
12.08.2017, 22:05
|
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: Строку из UTF-8 в ANSI
supercelt, а сообщения вынести в .h и править их в другом редакторе с нужной кодировкой? Наверняка они не каждый даже день правятся в итоге…
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:39.
|
|