windows c++ wchar_t* 转 string
时间: 2023-12-22 09:28:10 浏览: 73
以下是将wchar_t*转换为string的两种方法:
1.使用wstring_convert
```c++
#include <locale>
#include <codecvt>
#include <string>
std::wstring ws_str(L"你好中国");
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::string str = converter.to_bytes(ws_str);
```
2.使用wcstombs_s和malloc/free
```c++
#include <stdlib.h>
#include <string>
char* wchar2char(const wchar_t* wStr){
char *str;
size_t len = wcslen(wStr) + 1;
size_t converted = 0;
str=(char*)malloc(len*sizeof(char));
wcstombs_s(&converted, str, len, wStr, _TRUNCATE);
char* res = str;
free(str);
return res;
}
wchar_t wc_str[] = L"你好中国";
char* c_str = wchar2char(wc_str);
std::string str(c_str);
```
相关问题
wchar_t*和string实现自动转换
wchar_t*和string之间的自动转换可以通过使用标准库函数进行实现。可以使用以下函数之一来进行转换:
1. wstring_convert:该函数提供了在宽字符和多字节字符之间进行转换的功能。它可以将wstring转换为string,也可以将string转换为wstring。
2. mbstowcs:该函数可以将多字节字符转换为宽字符。
3. wcstombs:该函数可以将宽字符转换为多字节字符。
例如,可以使用以下代码将string转换为wchar_t*:
```c++
std::string str = "Hello, world!";
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::wstring wide_str = converter.from_bytes(str);
const wchar_t* wide_cstr = wide_str.c_str();
```
同样,可以使用以下代码将wchar_t*转换为string:
```c++
const wchar_t* wide_cstr = L"Hello, world!";
std::wstring wide_str(wide_cstr);
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string str = converter.to_bytes(wide_str);
```
wchar_t*和string实现自动转换 C++97
在 C++98/03 标准中,可以使用以下函数将 string 转换为 wchar_t*:
```c++
#include <locale>
#include <string>
std::wstring widen(const std::string& str) {
std::wstring wide_str(str.length(), L' '); // 创建一个宽字符串,长度为 str 的长度
std::locale loc(""); // 获取本地化信息
std::use_facet<std::ctype<wchar_t> >(loc).widen(str.data(), str.data() + str.length(), &wide_str[0]); // 转换 string 为宽字符串
return wide_str;
}
```
然后,可以使用以下函数将 wchar_t* 转换为 string:
```c++
#include <locale>
#include <string>
std::string narrow(const wchar_t* str) {
std::string narrow_str;
std::locale loc("");
for (; *str != L'\0'; ++str) {
narrow_str += std::use_facet<std::ctype<wchar_t> >(loc).narrow(*str, '?'); // 转换宽字符为多字节字符
}
return narrow_str;
}
```
示例代码如下:
```c++
#include <iostream>
#include <locale>
#include <string>
// 将 string 转换为 wchar_t*
std::wstring widen(const std::string& str) {
std::wstring wide_str(str.length(), L' '); // 创建一个宽字符串,长度为 str 的长度
std::locale loc(""); // 获取本地化信息
std::use_facet<std::ctype<wchar_t> >(loc).widen(str.data(), str.data() + str.length(), &wide_str[0]); // 转换 string 为宽字符串
return wide_str;
}
// 将 wchar_t* 转换为 string
std::string narrow(const wchar_t* str) {
std::string narrow_str;
std::locale loc("");
for (; *str != L'\0'; ++str) {
narrow_str += std::use_facet<std::ctype<wchar_t> >(loc).narrow(*str, '?'); // 转换宽字符为多字节字符
}
return narrow_str;
}
int main() {
std::string str = "Hello, world!";
std::wstring wide_str = widen(str);
const wchar_t* wide_cstr = wide_str.c_str();
std::cout << "wide_cstr: " << wide_cstr << std::endl;
std::string narrow_str = narrow(wide_cstr);
std::cout << "narrow_str: " << narrow_str << std::endl;
return 0;
}
```