Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как конвертировать TCHAR в string


Автор: php5 16.8.2013, 16:38
Нужно  определить путь к Temp  директории,  для этого  юзаю функцию
Код

TCHAR buf [MAX_PATH];
GetTempPath(MAX_PATH, buf);

Теперь   мне нужно полученный путь передать в переменную типа string

Автор: Alexeis 16.8.2013, 16:56
  В общем случае это не получиться. Я одно время делал так
Код

    typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR> > tstring;

tstring str(buf);

Автор: php5 16.8.2013, 17:39
а как из tstring в string ?   smile 

Автор: kuzulis 16.8.2013, 18:07
Цитата

а как из tstring в string ?  


Можешь просто использовать GetTempPathA, тогда в string без проблем. 

Автор: EgoBrain 19.8.2013, 03:52
Цитата(php5 @  16.8.2013,  16:38 Найти цитируемый пост)
Теперь   мне нужно полученный путь передать в переменную типа string 

Это можно сделать используя выходной строковый поток ostringstream:
Код

TCHAR buf[MAX_PATH];
GetTempPath(MAX_PATH, buf);
    
string str;
ostringstream ostr;
ostr<<buf;
    
str = ostr.str();

Только прежде чем использовать дождись комментариев экспертов, а то они еще могут тухлыми помидорами закидать  smile 

Автор: akizelokro 19.8.2013, 04:10
wcstombs (хоть статью уже пиши)

а GetTempDirA тоже должно сработать.

Автор: akizelokro 19.8.2013, 04:33
Притом, сама постановка вопроса некорректна. В зависимости от директив препроцессова tstring уже либо string (без Юникода), либо wstring (c  Юникодом).

так что код должен звучать так 

Код

#ifdef _UNICODE
// если юникод и TCHAR является WCHAR'ом
wbstombs(...)
#else
// ничего не делаем, TCHAR - уже CHAR, так что курим бамбук
#endif


Автор: Alexeis 19.8.2013, 07:49
Цитата(akizelokro @  19.8.2013,  05:10 Найти цитируемый пост)
wcstombs (хоть статью уже пиши)


Цитата(http://www.cplusplus.com/reference/cstdlib/wcstombs/)

The behavior of this function depends on the LC_CTYPE category of the selected C locale.


Остается еще выяснить в какой локали нужно преобразовывать и совсем все будет хорошо. В общем случае, если преобразовывать юникод к анси, такая кака может получиться. Поэтому, или везде TCHAR или везде wchar_t/char . Всякие переходы чреваты кракозяблами. 

Автор: akizelokro 19.8.2013, 08:48
Цитата

The behavior of this function depends on the LC_CTYPE category of the selected C locale.


Пусть делает в текущей локали (даже пусть не указывает). Когда он решит писать на экспорт, тогда и будет заморачиваться. Сейчас же я не думаю, что ему интересно, как китайцы или арабы увидят надписи в его программе

Добавлено через 4 минуты и 3 секунды
Цитата

Поэтому, или везде TCHAR или везде wchar_t/char . Всякие переходы чреваты кракозяблами.  


К тому же, от таких переходов никуда не деться. кой-где в майкрософте понасованы такие подводные камни, что проект в Юникоде, а вот в функцию надо передавать параметры в мультибайте. Или наоборот. Вот сейчас как рза такую задачку делаю.

Автор: php5 19.8.2013, 09:27
Всем  спасибо за коменты, пока что остановлюсь на GetTempPathA  smile 

Автор: Alexeis 19.8.2013, 09:41
Цитата(akizelokro @  19.8.2013,  09:48 Найти цитируемый пост)
кой-где в майкрософте понасованы такие подводные камни, что проект в Юникоде, а вот в функцию надо передавать параметры в мультибайте. Или наоборот.

  Единственное где такое встречал, это GetProcAddress, но экспорт может быть только в ASCII кодировки без расширения, так что там пофигу.

Автор: akizelokro 19.8.2013, 14:24
Цитата

Единственное где такое встречал, это GetProcAddress, но экспорт может быть только в ASCII кодировки без расширения, так что там пофигу. 

Вот сейчас только тема изменения ресурсов в экзешнике с помощью Begin/UpdateResource. Часть ресурсов только в юникоде, часть строго бинарные данные.
Как-то, кажется, совсем недавно, я попал на функции установки прокси в urlmon.h. Проект на юникоде, а пока не сбросил туда обычные строки, что-то не работало). Да и постоянно такие фенечки встречаются.
А уж если цеплять обращения к html-ресурсам с различными парсерами и тому подобное, то руку на таких ещах можно набить достаточно просто.
И ещё хорошо, если переносишь какуюнибудь либу с юникса на винду и она правильно написана. А то ведь получится связывать вещи в совершенно разных кодировках порой.

А если брать ещё и ActiveX, то там в дополнение к прочим мелочам (помимо CString) выползают и BSTR.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)