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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unicode 字符集环境下,可以使用第三方库实现简繁体换。一个常用的库是 OpenCC,它支持多种语言和平台,包括 C++。 使用 OpenCC 需要先安装库文件和字典文件。在 Linux 环境下,可以使用以下命令安装: ``` sudo apt-get install opencc sudo apt-get install opencc-dictionary-*.deb ``` 在 Windows 环境下,可以从官网下载安装包进行安装。 安装完成后,可以使用以下代码进行简繁体换: ```cpp #include <iostream> #include <opencc/opencc.h> int main() { const char* config = "t2s.json"; // 繁体简体的配置文件 opencc_t opencc = opencc_open(config); if (!opencc) { std::cerr << "Failed to open OpenCC" << std::endl; return 1; } const char* input = "繁体中文"; char* output = opencc_convert_utf8(opencc, input, -1); if (!output) { std::cerr << "Failed to convert text" << std::endl; return 1; } std::cout << "Input: " << input << std::endl; std::cout << "Output: " << output << std::endl; opencc_convert_utf8_free(output); opencc_close(opencc); return 0; } ``` 其中,`config` 变量指定了繁体简体的配置文件,可以根据实际需要选择不同的配置文件,比如 `s2t.json` 表示简体繁体。 `input` 变量是待换的文本,这里使用了 UTF-8 编码。 `opencc_convert_utf8` 函数将文本换为指定编码的文本,这里使用了 UTF-8 编码。如果换失败,返回 `nullptr`。 最后,需要调用 `opencc_convert_utf8_free` 函数释放内存,并调用 `opencc_close` 函数关闭 OpenCC。 需要注意的是,OpenCC 只是一种简繁体换的方法,可能会因为不同的字典和配置文件而产生不同的结果。在实际使用中,需要根据实际情况选择合适的字典和配置文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值