Как реализовать конвертацию строки unicode в utf-8 C++?

Здравствуйте! Есть проект на VS 2005, собирается в юникоде.
Привожу отрывок кода:
string LDAP="LDAP://";
	string path = LDAP + strDesc;
	wstring wstr( path.begin(), path.end() );
	LPCTSTR path2 = W2CT( wstr.c_str( ) );
	hr = ADsGetObject( path2, IID_IADs,(void**)&pUsr);

Все отрабатывает нормально, если в strDesc нет русских символов. В ADsGetObject первым параметром передается путь запроса, это строка типа LPCTSTR ,вопрос можно ли ее перекодировать из юникода в ютф-8, так как в rfc по LDAP написанно что поддерживается utf-8.
  • Вопрос задан
  • 5465 просмотров
Пригласить эксперта
Ответы на вопрос 4
nekipelov
@nekipelov
Можно взять utfcpp, использовать просто:

std::wstring ws;
            utf8::utf8to16( str.begin(), str.end(), std::back_inserter(ws) );

            std::string str;
            utf8::utf16to8( ws.begin(), ws.end(), std::back_inserter(str) );


Или сразу icu, где есть все для работы с многобайтовыми кодировками.

Ну или средства WinAPI: MultiByteToWideChar
Ответ написан
@Kvert007 Автор вопроса
В общем я решил посмотреть коды символов в строке вывел их в файл получил вот что
76
68
65
80
58
47
47
67
78
61
-34
-16
-24
-23
32
-49
-27
-14
-16
-18
-30
44
67
78
61
85
115
101
114
115
44
68
67
61
118
105
112
44
68
67
61
99
98
114
0

проверил символы они соответствуют кодировке cp1251 =>
мне из 1251 надо получить utf-8,можете поподробнее про про MultiByteToWideChar?
проблема еще в том что строку которую нужно передать 3им параметром в MultiByteToWideChar у меня типа LPCTSTR а требуется LPCSTR, как ее привести к этому типу и не будет ли потерь?
Ответ написан
@Kvert007 Автор вопроса
string strDesc = static_cast<CHAR*>(CW2A(bstr));//
	string LDAP="LDAP://";		//
	string path = LDAP + strDesc;
	wstring wstr( path.begin(), path.end() );	//
	LPCTSTR path2 = W2CT( wstr.c_str( ) );
	LPSTR path3 = const_cast<char *>(path.c_str());
	LPWSTR result;
	MultiByteToWideChar(CP_UTF8,0,path3,strlen(path3)+1,result, strlen(path3)+1);

почему то ни чего не возвращается
Ответ написан
Комментировать
@Kvert007 Автор вопроса
Если вместо hr = ADsGetObject( path2, IID_IADs,(void**)&pUsr); пишу
hr = ADsGetObject( L"русский текст", IID_IADs,(void**)&pUsr); то тоже все орабатывает, ни как не могу понять причину
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы