Официальный форум СВД Встраиваемые Системы
09 Декабря, 2016, 02:55:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
 
 
 Сайт СВД ВС  Начало   Помощь Поиск Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как в Photon-2 в QNX6.5.1 "Нейтрино" вывести символ на кириллице?  (Прочитано 703 раз)
Сергей123
Интересующийся

Сообщений: 6


« : 31 Декабря, 2013, 15:08:02 »

Стоит задача в Photon-2 в QNX6.5.1 "Нейтрино" с использованием функции форматного вывода типа sprintf выводить символы на кириллице? Причем, вывести символ на латинице получается, вывести строку на кириллице - тоже получается, а вывести символ на кириллице - нет. Использую шрифт cowr10. Помогите, пожалуйста. Листинг программы ниже.

PtArg_t           arg[10];
char              str[ 200 ];

sprintf( str, "%c", 'G');
PtSetArg(&arg[0], Pt_ARG_TEXT_STRING, str, 0);
PtSetResources(ABW_PtButton_1, 1, arg);
PtRealizeWidget(ABW_PtButton_1);     // выводится символ G

sprintf( str, "%s", "Жизнь");
PtSetArg(&arg[0], Pt_ARG_TEXT_STRING, str, 0);
PtSetResources(ABW_PtButton_2, 1, arg);
PtRealizeWidget(ABW_PtButton_2);     // выводится строка Жизнь

sprintf( str, "%c", 'Ж');
PtSetArg(&arg[0], Pt_ARG_TEXT_STRING, str, 0);
PtSetResources(ABW_PtButton_3, 1, arg);
PtRealizeWidget(ABW_PtButton_3);     // символ Ж не выводится Huh?
Записан
Олег Большаков
Администратор
Житель форума

Сообщений: 2934



WWW
« Ответ #1 : 31 Декабря, 2013, 16:21:23 »

А вот так выводится символ Ж?

Код:
sprintf( str, "%s", "Ж");
PtSetArg(&arg[0], Pt_ARG_TEXT_STRING, str, 0);
PtSetResources(ABW_PtButton_3, 1, arg);
PtRealizeWidget(ABW_PtButton_3);
Записан

Сергей123
Интересующийся

Сообщений: 6


« Ответ #2 : 01 Января, 2014, 13:41:25 »

Спасибо, но если было бы все так просто, я бы не просил помощи. Параметром функции  sprintf должен быть только символ, а не строка. Приведенный мной листинг лишь демонстрирует проблему. Программа, в которой это не работает большая, в ней я не хозяин. Строка формата в функции sprintf должна собирать и строки и символы и десятичные значения, то есть включать в себя: %d %c %s в различных комбинациях. Из всего не работает только %c. Здесь либо я по незнанию перепутал wchar_t c char, либо это глюк 6-ки, так как на 4-ке и photon 1.14 это все работает. Если я перепутал, помогите, пожалуйста разобраться, только не отсылайте к документации, я ее читал, не понял. Если это глюк или особенность 6-ки и Photon 2, то буду благодарен за информацию об этом. Но скорее я все же делаю что то не верно, помогите, пожалуйста.
Записан
Олег Большаков
Администратор
Житель форума

Сообщений: 2934



WWW
« Ответ #3 : 01 Января, 2014, 19:53:52 »

Действительно, для отображения кириллицы в Photon надо использовать UTF-8. В этой кодировке символ 'Ж' кодируется двумя байтами 0xD0 0x96. Два байта не могут поместиться в один однобайтовый тип char, и в этом случае не может использоваться спецификатор формата %c. Надо использовать тип данных wchar_t и префиксы l и L. Например, Вы можете заменить строку

Код:
sprintf( str, "%c", 'Ж');

на

Код:
sprintf( str, "%lc", L'Ж');

Обратите внимание, что исходный код Вы должны редактировать и сохранять в UTF-8 редакторе, например, ped.
Записан

Сергей123
Интересующийся

Сообщений: 6


« Ответ #4 : 01 Января, 2014, 21:41:55 »

Олег, большое спасибо. У меня получилось вывести символ. Но теперь я столкнулся с тем, что в функции sprintf я заранее не знаю содержимое строки формата и форматируемых данных. Например, может быть sprintf(str, format, d1,d2,...) строка format может быть и такой: "%lc %d "  и такой: "%d %lc", а форматируемые  данные соответственно: d1=L'Ж'; d2=5; или d2=5; d1=L'Ж'; Вопрос заключается в том как я узнаю когда мне нужно поставить перед форматируемым данным спецификатор 'L', если он нужен только для символа, а для числового значения он не нужен? Числовое значение в символ и строку переводить нельзя, нарушится идеология программы. Все форматируемые данные имеют одинаковый тип long (то есть long d1, long d2 и т.д.). Есть ли здесь решение? Буду благодарен за помощь.
Записан
Сергей123
Интересующийся

Сообщений: 6


« Ответ #5 : 02 Января, 2014, 13:29:38 »

Добавлю к предыдущему вопросу. А если я в редакторе med в 866 кодовой странице сформирую строку, отдам ее sprintf, а далее переведу результат в UTF-8. Вопрос в том какой функцией проще перевести исходную строку в UTF-8. У PxTranslateToUTF() много параметров (в первый параметр не знаю что передать), если что то попроще типа mbtowc()? Простите мне мою неграмотность... Если можно - напишите код.
Записан
Олег Большаков
Администратор
Житель форума

Сообщений: 2934



WWW
« Ответ #6 : 02 Января, 2014, 16:44:28 »

Вопрос заключается в том как я узнаю когда мне нужно поставить перед форматируемым данным спецификатор 'L', если он нужен только для символа, а для числового значения он не нужен?

Надо указывать L только перед литералом, перед переменной указывать L не нужно. Если Вы указываете в качестве аргумента 'Ж' (а не d1 или d2), то можете указать и L перед 'Ж'.
Записан

Олег Большаков
Администратор
Житель форума

Сообщений: 2934



WWW
« Ответ #7 : 02 Января, 2014, 17:02:23 »

Вопрос в том какой функцией проще перевести исходную строку в UTF-8. У PxTranslateToUTF() много параметров (в первый параметр не знаю что передать), если что то попроще типа mbtowc()? Простите мне мою неграмотность... Если можно - напишите код.

В документации на PxTranslateToUTF() говорится, что первый аргумент является значением, которое возвращает PxTranslateSet(). В документации на вторую функцию есть пример кода.
Записан

Сергей123
Интересующийся

Сообщений: 6


« Ответ #8 : 04 Января, 2014, 10:11:46 »

Олег, спасибо за помощь. Перебрав много вариантов, остановился на следующем:
1. В функции sprintf заменил в строке формата 'с' на 'lc';
2. Перед передачей в функцию sprintf любого символа при его инициализации перед ним ставлю модификатор L, при передаче любого другого элемента - ничего не ставлю. Работаю в редакторе ped в UTF-8.
Исходя из контекста моей задачи, мне так сделать было проще. Все работает. Спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP © 2002-2016 СВД Встраиваемые Системы.
При использовании материалов сайта ссылка на forum.kpda.ru обязательна.

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines | © Aiwan. Kolobok smiles | Sitemap
Valid XHTML 1.0! Valid CSS!
Сайт СВД ВС

В последний раз google посещал эту страницу 16 Ноября, 2016, 03:21:43