STL中的字符编码转换

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"); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值