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;
}