Сообщество программистов Autodesk в СНГ

ADN Club => ObjectARX => Тема начата: Эд от 08-10-2014, 22:13:21

Название: перевести const TCHAR* в std::string
Отправлено: Эд от 08-10-2014, 22:13:21
Можно ли перевести перевести const TCHAR* в std::string в проекте ObjARX?
Название: Re: перевести const TCHAR* в std::string
Отправлено: Александр Ривилис от 09-10-2014, 00:23:23
Можно ли перевести перевести const TCHAR* в std::string в проекте ObjARX?
Можно. Но правильнее переводить в std::wstring, т.к. TCHAR (начиная с версии AutoCAD 2007) являются символами UNICODE (два байта на символ).
P.S.: Вопрос вообще-то на знание C++  и ObjectARX имеет очень косвенное отношение.
P.S.S.: Если тебе нужен ответ на вопрос, то не поленись сформулировать его максимально подробно. В частности, зачем тебе нужен std::string. А на вопрос "Можно ли...?" я ответил четко: "Можно!"
Название: Re: перевести const TCHAR* в std::string
Отправлено: Александр Ривилис от 09-10-2014, 02:25:45
Кстати элементарное "гугление" (например такое (https://www.google.com.ua/search?q=wstring+TCHAR&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox-a&channel=sb&gfe_rd=cr&ei=gqI1VMufF9CAYPqZgbgK)) приводит например к такому решению: http://vajris.wordpress.com/2012/10/15/conversion-tchar-wstring-string-string/
Впрочем что будет с русскими буквами при преобразовании std::wstring в std::string при помощи этого кода я не берусь предсказывать.
Название: Re: перевести const TCHAR* в std::string
Отправлено: Николай Горлов от 09-10-2014, 11:05:37
Цитировать
Но правильнее переводить в std::wstring
увы, Александр, иногда это просто не возможно. Из личного опыта могу сказать, что библиотека ibpp, которой мы раньше пользовались для связи с СУБД Firebird требовала того, чтоб строки были именно CHAR* а не WCHAR*, т.к. 64-битного firebird не существует и по сей день. так что, пока не перешли на ADO, приходилось подтанцовывать с бубном :):):)
в качестве примера могу предложить:
std::wstring wcurName = _T("Широкая строка");
std::string scurName = CW2A(wcurName.c_str());
// wcurName.c_str() -> это и есть const TCHAR*
по поводу русского текста всё работает и без лишних телодвижений, но если будут проблемы, то перед работой с текстом (в основном это связано с  чтением/записью текстовых файлов) пользуюсь вот этим
#include <fstream>
...
_tsetlocale(LC_ALL,_T("russian"));// <---- это вставить перед началом работы с русским текстом (желательно, т.к. если вставить тупо в начале функции, может и не сработать)
FILE * fcreate = _tfopen(createFile.GetString(),_T("w"));
_ftprintf(fcreate,createScript.GetString());
fclose(fcreate);
Название: Re: перевести const TCHAR* в std::string
Отправлено: Александр Ривилис от 09-10-2014, 11:37:08
СУБД Firebird требовала того, чтоб строки были именно CHAR* а не WCHAR*, т.к. 64-битного firebird не существует и по сей день.
Николай. Ты тут смешиваешь два совершенно независимых понятия. При чем здесь 64-битный и WCHAR * ???
В 2006-ом году я написал такую статью: http://www.private.peterlink.ru/poleshchuk/cad/2006/M2007-AcString.htm
Возможно она будет полезна Эд.
Название: Re: перевести const TCHAR* в std::string
Отправлено: Николай Горлов от 09-10-2014, 12:25:21
хм... перечитал свой ответ еще раз. вроде ничего не смешиваю :)
тема звучит как-то так: "перевести const TCHAR* в std::string"
ваш ответ был: "правильнее переводить в std::wstring"

вот я и описал случай когда НУЖНО переводить именно в string a не в wstring. firebird был взят просто для примера, т.к. он требует на вход всех своих функций именно char* а не wchar* (может если б появился 64-битный и логика была б у него другая (смысла развиватьт эту тему не вижу, т.к. от нас все-равно ничего не зависит), не знаю. живем сегодняшним днем).

PS: возможно я не прав, но с 2000-лохматого года TCHAR* у меня ассоциируется благодаря objectarx исключительно с широкой строкой :), ибо юникод на дворе :):):), следовательно, для себя тему я трактовал так: "перевести const WCHAR* в std::string", т.е широкую строку в обычную. ну и ответил кусочком кода  ::)
Название: Re: перевести const TCHAR* в std::string
Отправлено: Александр Ривилис от 09-10-2014, 12:38:39
хм... перечитал свой ответ еще раз. вроде ничего не смешиваю :)
Ты смешал 64-битность и Unicode (перечитай тот кусок твоего текста, который я цитировал). А это совершенно разные вещи. Привожу пример. AutoCAD 2007 был только 32-битный, но Unicode.
Название: Re: перевести const TCHAR* в std::string
Отправлено: Александр Ривилис от 09-10-2014, 12:39:29
ну и ответил кусочком кода  ::)
Код то как раз правильный, но причем здесь 64-битность ???
Название: Re: перевести const TCHAR* в std::string
Отправлено: Николай Горлов от 09-10-2014, 13:21:11
Цитировать
но причем здесь 64-битность
каюсь, блондинка я  ::). голова чуток другим забита.
просто для меня возможность использовать юникодовые строки тупо означает возможность написания 64-битного приложения (вариант использования широких строк для 32-битных китайцев как-то в голову не пришел сразу. а русский и английский смело вмещаются и в простую строку. как-то ж жили до 2007 акада). вот и ассоциация сразу в голову влезла, что юникод = 64-bit.
ps: только из отпуска, и еще никак не могу включиться в рабочий ритм  ;D
ps2: да и уже давненько я перелез на 64 бита, так что теперь изначально все под них идет, а уж потом на 32 иногда на другом компике проверяю результаты