Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (ст)Как лучше работать с Уникод. (vc++)  (Прочитано 36585 раз)
0 Пользователей и 1 Гость смотрят эту тему.
PSD
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline 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
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 01-09-2003 07:11 » 

gcvt  это функция типа itoa конвертит double в текстовую строку.
Цитата

s[0]=TEXT('Y');

А TEXT() и _Т() это  одно и тоже?  Или нет.

Я посмотрел по исходникам получается что при включении юникода
TCHAR обявляется как WCHAR и все дела?
Записан

Да да нет нет все остальное от лукавого.
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 01-09-2003 07:14 » 

Цитата

А TEXT() и _Т() это одно и тоже


Посмотри как они объявлены, это же #define обыкновенный.

Цитата

TCHAR обявляется как WCHAR и все дела?


А ты чего хотел?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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 строку
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 01-09-2003 09:58 » 

Цитата

_UNICODE и UNICODE сформирует не Unicode, а ANSI строку

Я не имел ввиду системный макрос  а говорил о собственном определении типа данных - т.е. используется или не используется UNICODE .
Записан

А птичку нашу прошу не обижать!!!
Serega
Гость
« Ответ #8 : 01-09-2003 10:07 » 

А зачем придумывать какие-то макросы, использовать не переносимые функции, когда все эти проблемы уже решены до нас
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #9 : 01-09-2003 10:16 » 

Цитата

Это как ?


А у меня так- я вобще не пишу не UNICODE программы для Windows NT/2k/XP/2003. И не мучаюсь.
Записан
dorador
Гость
« Ответ #10 : 01-09-2003 10:23 » 

Цитата: Serega
А зачем придумывать какие-то макросы, использовать не переносимые функции, когда все эти проблемы уже решены до нас

Если рассматривать проблему относительно Win32, а не ActivX
то она решена до нас именно применением макросов из tchar.h
Записан
PSD
Главный специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 01-09-2003 10:59 » 

Цитата

А у меня так- я вобще не пишу не UNICODE программы для Windows NT/2k/XP/2003. И не мучаюсь.

У меня тут половина 95/98 поэтому приходися иметь покрайней мере две версии.
Записан

Да да нет нет все остальное от лукавого.
dorador
Гость
« Ответ #12 : 01-09-2003 11:27 » 

Цитата: PSD

У меня тут половина 95/98 поэтому приходися иметь покрайней мере две версии.

я тоже работаю и под 98/Me и под 2000/XP, но делаю одну неUnicode версию
а применение tchar.h рассматриваю как задел на будущее (вдруг мелкомягкие вовсе откажутся от ANSI, тем более в CE они это уже сделали)
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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"
я говорил про применение макросов из него
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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
делать не надо было бы
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #17 : 01-09-2003 16:13 » 

Цитата

P.S. а можно char так же переопределить  тогда

Да действительно - а про char хедер - к сожалению он переопределятся в огромном файле коммерческого проекта - если выкрою время, то я вытащу и опубликую...
Записан

А птичку нашу прошу не обижать!!!
dorador
Гость
« Ответ #18 : 05-09-2003 13:42 » 

с переопределением char это уже я тормознул :?
Люди ! а какая реальная причина использования UNICODE ?
Win CE или что-то другое?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #19 : 05-09-2003 14:12 » 

Например, если на компьютере, на котором ты запускаешь программу, системный шрифт и локаль не русские, то без unicode будут еггоглифы Отлично
Конечно, если текст с кириликой.
Вот англопишуших это совсем не беспокоит...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Diletant
Помогающий

de
Offline 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #22 : 05-09-2003 18:12 » new

Нет конечно - но это уже будет не твоя вина  Отлично
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines