Кончик айсберга
LPCTSTR
может быть либо однобайтовой, либо многобайтовой строкой (зависит от того, определена ли константа UNICODE
во время компиляции или нет), пока пользователи std::string
(включая вашу функцию) обычно используют ее для хранения однобайтовой строки.
Вам потребуются два преобразования: одно для LPCSTR
(не UNICODE
build) и одно для LPCWSTR
(UNICODE
сборка).Первый прост:
std::string convert(LPCSTR str) {
return std::string(str);
}
Второй требует, чтобы его входной параметр был сначала преобразован в другую кодировку с помощью WideCharToMultiByte
.Не беспокойтесь по имени, результат может быть однобайтовой символьной строкой;это зависит от параметра CodePage
.Вам придется использовать кодовую страницу для однобайтовой кодировки, например CP_ACP
.
Обновление: WideCharToMultiByte
пример
Имейте в виду, чтоточное преобразование в однобайтовую кодировку технически невозможно, если входная строка содержит символы, которых нет в кодовой странице целевой кодировки. Поскольку вы упоминаете, что это будет для функций файловой системы, если путь к файлу содержит такие символы, преобразование будетне будет на 100% точным, и последующие вызовы функций не будут выполнены.
std::string MBFromW(LPCWSTR pwsz, UINT cp) {
int cch = WideCharToMultiByte(cp, 0, pwsz, -1, 0, 0, NULL, NULL);
char* psz = new char[cch];
WideCharToMultiByte(cp, 0, pwsz, -1, psz, cch, NULL, NULL);
std::string st(psz);
delete[] psz;
return st;
}
Caveat emptor: Приведенный выше пример взят из некоторого кода, который я лежал без дела, и не соответствует качеству производственного уровня.Единственный очевидный недостаток заключается в том, что он не исключает исключений.Это также может убить всех милых пурпурных единорогов.Используйте его только как пример .
Полный ад кодирования
Голая правда в том, что std::string
можно использовать для многобайтовых кодировок (таких как UTF8) просто отлично- вы даже можете использовать его для хранения строк с широким символом, так как это просто двоично-безопасный массив байтов в основе.
Проблема в том, что функции STL, которые применяются к std::string
, ожидаютего содержимое должно быть в однобайтовой кодировке , и они не будут давать правильных результатов, если это не так.
По расширению мы не знаем, какую функцию выполняет ваша функцияпараметр std::string
ожидает - он может ожидать строку, закодированную в UTF-8.Но «по соглашению», я предполагаю, что он также хочет однобайтовую строку в кодировке.