c++ string转wstring乱码
时间: 2023-06-23 11:46:00 浏览: 28
在 C++ 中,将 string 转换为 wstring 可以使用以下方法:
```cpp
#include <locale>
#include <codecvt>
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
std::wstring wide = converter.from_bytes(narrow);
```
其中,narrow 为要转换的 string 类型变量,wide 为转换后的 wstring 类型变量。
如果你在转换过程中出现乱码,可能是因为编码格式不匹配。你可以尝试使用其他编码格式的转换器,比如 std::codecvt_utf16 或 std::codecvt_utf8_utf16,来解决这个问题。
相关问题
string转wstring
在C++中,string类型表示的是一个ASCII字符串,而wstring类型表示的是一个Unicode字符串。如果我们需要将一个string类型的字符串转化成wstring类型的字符串,我们可以使用以下步骤:
1. 使用wstring的构造函数,将string类型的字符串作为参数传入,生成一个临时的wstring类型的变量。
如:wstring tempStr(str);
2. 将临时的wstring类型变量的值赋给目标变量。
如:wstring wstr = tempStr;
或者简写为:wstring wstr(str.begin(), str.end());
这样就完成了string类型转化为wstring类型的过程。
需要注意的是,如果被转化的string类型的字符串中包含非ASCII字符,这些字符在转化过程中可能会出现乱码。因此,在进行转化之前,应该确保被转化的string类型的字符串中只包含ASCII字符,或者使用合适的编码方式来处理非ASCII字符。
C++string 中文显示乱码
C++中的string类型默认使用的是ASCII编码,而中文字符使用的是Unicode编码,因此如果直接将中文字符存储到string中,就会出现乱码问题。解决方法如下:
1. 使用wstring类型代替string类型,wstring是宽字符类型,支持Unicode编码。例如:
```c++
#include <iostream>
#include <string>
using namespace std;
int main()
{
wstring str = L"你好,世界!";
wcout << str << endl;
return 0;
}
```
2. 将中文字符转换为ASCII编码的字符串,例如使用UTF-8编码时,可以使用iconv库进行转换,示例如下:
```c++
#include <iostream>
#include <string>
#include <iconv.h>
using namespace std;
string utf8_to_ascii(const string& utf8_str)
{
iconv_t cd = iconv_open("ASCII//TRANSLIT", "UTF-8");
if (cd == (iconv_t)-1) {
cerr << "iconv_open failed" << endl;
return "";
}
size_t in_len = utf8_str.size();
size_t out_len = in_len * 3; // ASCII编码一个字符最多占用3个字节
char* out_buf = new char[out_len + 1];
char* in_buf = const_cast<char*>(utf8_str.c_str());
char* out_ptr = out_buf;
if (iconv(cd, &in_buf, &in_len, &out_ptr, &out_len) == (size_t)-1) {
cerr << "iconv failed" << endl;
delete[] out_buf;
iconv_close(cd);
return "";
}
*out_ptr = '\0'; // 手动添加字符串结束符
string result(out_buf);
delete[] out_buf;
iconv_close(cd);
return result;
}
int main()
{
string str = "你好,世界!";
string ascii_str = utf8_to_ascii(str);
cout << ascii_str << endl;
return 0;
}
```
以上是两种解决方案,可以根据实际情况选择。