C++工程中编码转换的场景还是很多的,如果用QT工程,QString本身就提供了很多转换的函数,如果是Win32项目,也可以借助WideCharToMultibyte函数进行转换,问题是不能跨平台,这个接口也不方便用。所以利用C++自身提供的库来解决是最好的。
#include <iostream>
#include <string>
#include <locale>
int main()
{
std::locale loc("");
auto& f = std::use_facet<std::codecvt<wchar_t, char, std::mbstate_t>>(loc);
std::string src = "中国你好HelloChina!!@";
std::mbstate_t mb{};
std::wstring dest(src.size(),'\0');
const char* from_next;
wchar_t* to_next;
f.in(mb, &src[0], &src[src.size()], from_next, &dest[0], &dest[dest.size()], to_next);
dest.resize(to_next - &dest[0]);
std::wcout.imbue(std::locale(""));
std::wcout << dest <<std::endl;
int wait;
std::cin >> wait;
}
- src是按照本地默认地区的编码来的,中国地区应该就是gbk
- std::user_facet是一个用于使用转码的接口,提供了一些转码的方法,需要一个locale作为参数,std::locale loc("")就是获取本地系统默认编码,也就是gbk
- 将本地编码转换为wchar_t需要用到facet的in方法,如果要将wchar_t转本地编码,就用out方法,调用过程相同。
- 如果src编码是utf-8,std::string src = u8"中国你好HelloChina!!@"; 那么就需要改为std::locale loc("zh_CN.utf8");