2015-12-06 5 views
1

У меня есть переменная wstring и строковая переменная в C++. Я хочу объединить их обоих, но просто добавление их вместе приводит к ошибке сборки. Как я могу объединить их обоих? Если мне нужно преобразовать переменную wstring в строку, как бы это сделать?Как объединить строку и wstring?

//A WCHAR array is created by obtaining the directory of a folder - This is part of my C++ project 
WCHAR path[MAX_PATH + 1] = { 0 }; 
GetModuleFileNameW(NULL, path, MAX_PATH); 
PathCchRemoveFileSpec(path, MAX_PATH); 

//The resulting array is converted to a wstring 
std::wstring wStr(path); 

//An ordinary string is created 
std::string str = "Test"; 

//The variables are put into this equation for concatenation - It produces a build error 
std::string result = wStr + str; 
+0

В соответствии с соглашениями Windows На 'станд :: струнные 'не может представлять широкую строку, в общем. Если он предназначен для использования в качестве пути к файловой системе, то это * одно * конкретное преобразование, но если оно предназначено для отображения пользователю, то это * другое * преобразование. Так что во многом зависит от того, что вы намерены использовать для 'std :: string', в чем его цель **? –

+0

«Обычная строка» - странный термин. Какой набор символов и кодировка вы хотите получить? Если это не кодировка Unicode (например, UTF-8), вы потеряете данные, потому что 'GetModuleFileNameW' будет подсчитанной последовательностью кодовых единиц UTF-16. –

ответ

1

Преобразовать wstring к string первым, как this:

std::string result = std::string(wStr.begin(), wStr.end()) + str; 

или если wStr содержит не-ASCII символы:

std::wstring_convert<std::codecvt_utf8<wchar_t>> converter; 
std::string wStrAsStr = converter.to_bytes(wStr); 
std::string result = wStrAsStr + str; 
+0

Это преобразование теряет информацию в общем случае, и в зависимости от используемых условных обозначений может возникнуть недопустимое значение 'std :: string' (например, недопустимые байты для кодировки UTF-8), и поэтому рекомендовать его без упоминания ограничений немного безрассудный. –

+0

Добавлена ​​более безопасная альтернатива. – emlai

+0

:) Теперь он не теряет информации, что хорошо, но поскольку это программирование на Windows, это уже не очень полезно: не работает как путь и не отображается должным образом в файлах GUI (я считаю, что потоки могут быть настроен так, чтобы правильно представлять его на консоли, но не уверен в этом). Однако он может быть использован, например, сериализация широкой строки. Все это зависит от ** цели **, которую ОП пренебрегает упоминанием. –

Смежные вопросы