网上看了好多说转文件编码格式的,在我的项目中感觉不是很实用,下面那个我愿称其为终结解决方案
解决方案
思路:先将中文给到wstring,然后再转为string。完美
环境:windows vs2019 C++19、C++11
代码:
#include <string>
#include <locale.h>
// 需包含locale、string头文件、使用setlocale函数。
// string转wstring
std::wstring StringToWstring(const std::string str)
{
unsigned len = str.size() * 2; // 预留字节数
setlocale(LC_CTYPE, ""); //必须调用此函数
wchar_t* p = new wchar_t[len]; // 申请一段内存存放转换后的字符串
mbstowcs(p, str.c_str(), len); // 转换
std::wstring str1(p);
delete[] p;// 释放申请的内存
return str1;
}
// wstring转string
std::string WstringToString(const std::wstring str)
{
unsigned len = str.size() * 4;
setlocale(LC_CTYPE, "");
char* p = new char[len];
wcstombs(p, str.c_str(), len);
std::string str1(p);
delete[] p;
return str1;
}
// 清空场景
int main()
{
std::wstring a = L"你好"; // 宽字符标识 L
std::string b = WstringToString(a);
// 这时候已经正常了,可以进行我们自己的操作了
···
···
return 0;
}
扩展
std::wstring和std::string是C++中两种表示字符串的不同类型。
std::string是基于单字节字符的字符串类型,适用于存储和处理ASCII字符集中的字符。它使用标准的C-风格的字符串表示(以空字符’\0’结尾)。这意味着每个字符只占用一个字节的存储空间。
std::wstring是宽字符字符串类型,用于存储和处理所有Unicode字符(包括中文字符)。它使用一个或多个宽字符编码来表示每个字符,通常使用UTF-16或UTF-32编码。宽字符类型的字符串可以容纳更广泛的字符范围,并提供了更好的支持多语言和国际化。
在C++中,你可以根据需要选择std::string还是std::wstring来存储字符串数据。如果你需要处理中文字符或其他Unicode字符,建议使用std::wstring。然而,要注意库和函数的兼容性,因为不是所有的第三方库和函数都能支持std::wstring和宽字符编码。在这种情况下,你可能需要进行类型转换或使用其他字符串处理方法。
总之,std::string适用于ASCII字符集,而std::wstring适用于更广泛的Unicode字符集,特别是处理非ASCII字符时会更有优势。