C++常用字符集转换方法二

C++常用字符转换UTF8到string类型:
直接C++提供的接口,但是此接口为C++11以上才能使用,此方法可以直接跨平台使用,在linux、window下都适用
例如:在代码中这接写中文转UTF8码,可以使用如下接口
string str=“中国”
string utf8Str = String2UTF8(str);

#include <stdlib.h>
#include <codecvt>
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstdlib>
#include <memory>

std::string UnicodeToUTF8(const std::wstring& wstr);

std::wstring UTF8ToUnicode(const std::string& str);

std::string UnicodeToANSI(const std::wstring& wstr);

std::wstring ANSIToUnicode(const std::string& str);

std::string UTF8ToANSI(const std::string& str);

std::string ANSIToUTF8(const std::string& str);

std::wstring String2Wstring(const std::string& str);

std::string Wstring2String(const std::wstring& wstr);

std::string String2UTF8(const std::string& str);

std::string UTF82String(const std::string& str);
std::string UnicodeToUTF8(const std::wstring& wstr)
{
	std::string ret;
	try
	{
		std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
		ret = wcv.to_bytes(wstr);
	}
	catch (const std::exception& e)
	{
		std::cerr << e.what() << std::endl;
	}
	return ret;
}

std::wstring UTF8ToUnicode(const std::string& str)
{
	std::wstring ret;
	try
	{
		std::wstring_convert< std::codecvt_utf8<wchar_t> > wcv;
		ret = wcv.from_bytes(str);
	}
	catch (const std::exception& e)
	{
		std::cerr << e.what() << std::endl;
	}
	return ret;
}

std::string UnicodeToANSI(const std::wstring& wstr)
{
	std::string ret;
	std::mbstate_t state = {};
	const wchar_t* src = wstr.data();
	size_t len = std::wcsrtombs(nullptr, &src, 0, &state);
	if (static_cast<size_t>(-1) != len)
	{
		std::unique_ptr< char[] > buff(new char[len + 1]);
		len = std::wcsrtombs(buff.get(), &src, len, &state);
		if (static_cast<size_t>(-1) != len)
		{
			ret.assign(buff.get(), len);
		}
	}
	return ret;
}

std::wstring ANSIToUnicode(const std::string& str)
{
	std::wstring ret;
	std::mbstate_t state = {};
	const char* src = str.data();
	size_t len = std::mbsrtowcs(nullptr, &src, 0, &state);
	if (static_cast<size_t>(-1) != len)
	{
		std::unique_ptr< wchar_t[] > buff(new wchar_t[len + 1]);
		len = std::mbsrtowcs(buff.get(), &src, len, &state);
		if (static_cast<size_t>(-1) != len)
		{
			ret.assign(buff.get(), len);
		}
	}
	return ret;
}

std::string UTF8ToANSI(const std::string& str)
{
	return UnicodeToANSI(UTF8ToUnicode(str));
}

std::string ANSIToUTF8(const std::string& str)
{
	return UnicodeToUTF8(ANSIToUnicode(str));
}

/*
//转换版本一
//如果你的 g++ 版本够高(5.0以上),那么可以采用下面的写法,这是最好的:
std::wstring String2Wstring(const std::string& str)
{
	std::string temp = str;
	using convert_typeX = std::codecvt_utf8<wchar_t>;
	std::wstring_convert<convert_typeX, wchar_t> converterX;

	return converterX.from_bytes(temp);
}

std::string Wstring2String(const std::wstring& wstr)
{
	using convert_typeX = std::codecvt_utf8<wchar_t>;
	std::wstring_convert<convert_typeX, wchar_t> converterX;

	return converterX.to_bytes(wstr);
}
*/

//转换版本二
//如果你的 g++ 版本是支持部分 c++11 特性,那么第二个版本可以用 unique_ptr 来管理内存,这样可以避免直接操作指针的尴尬,程序更加安全。
std::wstring String2Wstring(const std::string& str)
{
	if (str.empty())
	{
		return L"";
	}
	unsigned len = str.size() + 1;
	setlocale(LC_CTYPE, "");
	wchar_t* p = new wchar_t[len];
	mbstowcs(p, str.c_str(), len);
	std::wstring w_str(p);
	delete[] p;
	return w_str;
}

std::string Wstring2String(const std::wstring& w_str)
{
	if (w_str.empty())
	{
		return "";
	}
	unsigned len = w_str.size() * 4 + 1;
	setlocale(LC_CTYPE, "");
	char* p = new char[len];
	wcstombs(p, w_str.c_str(), len);
	std::string str(p);
	delete[] p;
	return str;
}

/*
//转换版本三
//如果 g++ 连 unique_ptr 都不支持,那就只能使用下面的 new / delete 了
std::wstring String2Wstring(const std::string& str)
{
	if (str.empty())
	{
		return L"";
	}
	unsigned len = str.size() + 1;
	setlocale(LC_CTYPE, "en_US.UTF-8");
	wchar_t* p = new wchar_t[len];
	mbstowcs(p, str.c_str(), len);
	std::wstring w_str(p);
	delete[] p;
	return w_str;
}

std::string Wstring2String(const std::wstring& w_str)
{
	if (w_str.empty())
	{
		return "";
	}
	unsigned len = w_str.size() * 4 + 1;
	setlocale(LC_CTYPE, "en_US.UTF-8");
	char* p = new char[len];
	wcstombs(p, w_str.c_str(), len);
	std::string str(p);
	delete[] p;
	return str;
}
*/

std::string String2UTF8(const std::string& str)
{
	std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
	std::wstring temp = String2Wstring(str);
	std::string string = converter.to_bytes(temp);

	return string;
}

std::string UTF82String(const std::string& str)
{
	std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
	std::wstring wide_string = converter.from_bytes(str); 

	std::string string = Wstring2String(wide_string);
	return string;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值