PSD
Главный специалист
Offline
Пол:
|
|
« : 01-09-2003 06:29 » |
|
VC 6.0 Проект ActivX Есть не обходимость писать код который будет компилися как с Уникодом нак и без него. Нужен пример как проще оформить куски такого вида char s[10]; double b; s[0]='Y'; s[1]=':'; b=psdg->MGD.Zero-(((double )psdg->m_CGP.Y)/psdg->MGD.DY ) ; gcvt(b,8,&s[2]); pDC->ExtTextOut( 5,5+DY+5,ETO_CLIPPED,r,s,8,NULL) ; Чтобы компилилось как в юникоде так и безнего.
|
|
« Последнее редактирование: 19-12-2007 19:53 от Алексей1153++ »
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #1 : 01-09-2003 07:00 » |
|
TCHAR s[10]; double b; s[0]=TEXT('Y'); s[1]=TEXT(':'); b=psdg->MGD.Zero-(((double )psdg->m_CGP.Y)/psdg->MGD.DY ) ; gcvt(b,8,&s[2]); pDC->ExtTextOut( 5,5+DY+5,ETO_CLIPPED,r,s,8,NULL) ;
что такое gcvt не знаю. Остальные ф-ции должны иметь как ANSI так и UNICODE версии и выбираются они на этапе компиляции в зависимости от того определена переменная UNICODE или нет.
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #2 : 01-09-2003 07:11 » |
|
gcvt это функция типа itoa конвертит double в текстовую строку. s[0]=TEXT('Y');
А TEXT() и _Т() это одно и тоже? Или нет. Я посмотрел по исходникам получается что при включении юникода TCHAR обявляется как WCHAR и все дела?
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #3 : 01-09-2003 07:14 » |
|
А TEXT() и _Т() это одно и тоже
Посмотри как они объявлены, это же #define обыкновенный. TCHAR обявляется как WCHAR и все дела?
А ты чего хотел?
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #4 : 01-09-2003 09:07 » |
|
PSD - TEXT(), _T(), L() - это макросы кодирующие строку из однобайтной в двубайтную...
Я бы сделал так
#ifdef UNICODE #define MYCHAR char #else #define MYCHAR TCHAR #endif
После чего определил бы UNICODE в установках проекта для компиляции в юникод и наоборот.
Конечно придется передевайнить еще и strstr strcpy и т.д. - т.е. все тобой используемые функции так же как тип переменной, для различных вариантов использую для юникода функции из абора wcsstr вместо strstr и т.д.
Я обычно создавал дирректорию common в которую витыкал файл .h с описаниями таких вот штук....
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Serega
Гость
|
|
« Ответ #5 : 01-09-2003 09:53 » |
|
Попробуй так double d = ...; _bstr_t str = _T)"Y{": + _bstr_t)_variant_t)d::;
|
|
|
Записан
|
|
|
|
dorador
Гость
|
|
« Ответ #6 : 01-09-2003 09:55 » |
|
Тема использования Unicode не плохо освещена у Рихтера в его "Windows для профи" еще я читал про это у Румянцева "Азбука программирования Win32 API" я вывел для себя следующие правила 1. вместо string.h использовать tchar.h 2. вместо char использовать TCHAR 3. строковые литералы обрамлять макросом _T() 4. вместо привычных функций работы со строками, типа strcpy, использовать макросы из tchar.h, типа _tcscpy что касается приведенного фрагмента кода, то ИМХО лучше вместо char s[10(; double b; s[0(='Y'; s[1(='{'; ... _gcvt)b,8,&s[2(:; использовать #include <tchar.h> ... TCHAR s[10(; double b; ... _stprintf)s, _T)"Y=%f":, b:; во всяком случае _gcvt всегда независимо от определения макросов _UNICODE и UNICODE сформирует не Unicode, а ANSI строку
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #7 : 01-09-2003 09:58 » |
|
_UNICODE и UNICODE сформирует не Unicode, а ANSI строку
Я не имел ввиду системный макрос а говорил о собственном определении типа данных - т.е. используется или не используется UNICODE .
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Serega
Гость
|
|
« Ответ #8 : 01-09-2003 10:07 » |
|
А зачем придумывать какие-то макросы, использовать не переносимые функции, когда все эти проблемы уже решены до нас
|
|
|
Записан
|
|
|
|
SlavaI
Главный специалист
Offline
|
|
« Ответ #9 : 01-09-2003 10:16 » |
|
Это как ?
А у меня так- я вобще не пишу не UNICODE программы для Windows NT/2k/XP/2003. И не мучаюсь.
|
|
|
Записан
|
|
|
|
dorador
Гость
|
|
« Ответ #10 : 01-09-2003 10:23 » |
|
А зачем придумывать какие-то макросы, использовать не переносимые функции, когда все эти проблемы уже решены до нас Если рассматривать проблему относительно Win32, а не ActivX то она решена до нас именно применением макросов из tchar.h
|
|
|
Записан
|
|
|
|
PSD
Главный специалист
Offline
Пол:
|
|
« Ответ #11 : 01-09-2003 10:59 » |
|
А у меня так- я вобще не пишу не UNICODE программы для Windows NT/2k/XP/2003. И не мучаюсь.
У меня тут половина 95/98 поэтому приходися иметь покрайней мере две версии.
|
|
|
Записан
|
Да да нет нет все остальное от лукавого.
|
|
|
dorador
Гость
|
|
« Ответ #12 : 01-09-2003 11:27 » |
|
У меня тут половина 95/98 поэтому приходися иметь покрайней мере две версии.
я тоже работаю и под 98/Me и под 2000/XP, но делаю одну неUnicode версию а применение tchar.h рассматриваю как задел на будущее (вдруг мелкомягкие вовсе откажутся от ANSI, тем более в CE они это уже сделали)
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #13 : 01-09-2003 12:04 » |
|
Если рассматривать проблему относительно Win32, а не ActivX то она решена до нас именно применением макросов из tchar.h
Очень интересно... У меня есть 2000 строк кода рботы с char и мне надо их перевести на TCHAR и работу с юникодом. Давай ка автоматизируй одним include "tchar.h" весь этот процесс...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
dorador
Гость
|
|
« Ответ #14 : 01-09-2003 14:34 » |
|
автоматизируй одним include "tchar.h" весь этот процесс
А кто говорил что это делается автоматически включением include "tchar.h" я говорил про применение макросов из него
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #15 : 01-09-2003 14:50 » |
|
Тогда разберись с тем, что я написал. Я написал, что можно автоматизировать употребление макросов TCHAR.H и стандратных вызовов функций str*** с помощью #define собственного ФЛАГА (а не макроса), и дополнительного .h файла в котором переопределить употребление вместо str*** wcs*** из файла tchar.h в зависимости от использования кода...
Пример
//
#ifndef __common_h #define __common_h
#ifdef UNICODE_COMPILE MYCHA TCHAR #define strstr wcsstr ...... #else MYCHAR char #endif
Таким образом переделка текста в 5 - 10 тыш строк приводится к действию во всех файлах - замена char -> MYCHAR Find+Replace
Подключения common.h во все места куда надо и определения флага UNICODE_COMPILE в проекте = 1....
То что я написал чуть попроще прежде.
Теперь посоветуй метод проще - я хотел бы его знать ибо это вопрос нетревиальный (без издевки или иронии), потому как я не впервый раз проекты перерабатываю из - за таких вещей...
ПыСы Правда в этот метод не подойдут алгоритмы с смещением и редактированием строк с побайтной работой, так как замена на двух байтный юникод потребует изменение цифровых коэффициентов - расчитываемых с учетом 1 - го байта на символ и не с помощью стандартных процедур...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
dorador
Гость
|
|
« Ответ #16 : 01-09-2003 15:34 » |
|
Теперь посоветуй метод проще - я хотел бы его знать ибо это вопрос нетревиальный (без издевки или иронии), потому как я не впервый раз проекты перерабатываю из - за таких вещей...
Полностью согласен, что твой метод замены #define strstr wcsstr
при перерабатывании готовых проектов ЛУЧШИЙ я говорил про новые проекты хотя от твоего дополнительного хедера я бы не отказался у него есть то преимущество, что можно пользоваться привычными функциями :!: microsoft тут явно тормознула P.S. а можно char так же переопределить :?: тогда char -> MYCHAR Find+Replace
делать не надо было бы
|
|
|
Записан
|
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #17 : 01-09-2003 16:13 » |
|
P.S. а можно char так же переопределить тогда
Да действительно - а про char хедер - к сожалению он переопределятся в огромном файле коммерческого проекта - если выкрою время, то я вытащу и опубликую...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
dorador
Гость
|
|
« Ответ #18 : 05-09-2003 13:42 » |
|
с переопределением char это уже я тормознул :? Люди ! а какая реальная причина использования UNICODE ? Win CE или что-то другое?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #19 : 05-09-2003 14:12 » |
|
Например, если на компьютере, на котором ты запускаешь программу, системный шрифт и локаль не русские, то без unicode будут еггоглифы Конечно, если текст с кириликой. Вот англопишуших это совсем не беспокоит...
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Diletant
Помогающий
Offline
|
|
« Ответ #20 : 05-09-2003 15:36 » |
|
P.S. а можно char так же переопределить тогда С переопределением char или BYTE все не так просто. По крайней мере, для сетевых проектов, где команды протоколов должны быть строками с однобайтными символами. Или для всевозможных почтовых утилит. Поэтому IMHO метод с TCHAR предпочтительней, посколькупозволяет сразу отделить переменные, для которых Unicode использовать нельзя.
|
|
|
Записан
|
|
|
|
dorador
Гость
|
|
« Ответ #21 : 05-09-2003 16:02 » |
|
Например, если на компьютере, на котором ты запускаешь программу, системный шрифт и локаль не русские, то без unicode будут еггоглифы Конечно, если текст с кириликой.
А что если unicode-прогу с русским интерфейсом запустить на компе, где никакие языки кроме английского не установлены, на экране будет кириллица?
|
|
|
Записан
|
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #22 : 05-09-2003 18:12 » |
|
Нет конечно - но это уже будет не твоя вина
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
|