c++ 编码理解,
STD::WCOUT输出到console,以及从string到Wstring转换理解。
直接上代码吧
有时间再来整理。
// convert string to wstring
std::wstring str_to_wstring(const std::string &str, const std::locale &loc = std::locale())
{
std::vector<wchar_t> buf(str.size());
std::use_facet<std::ctype<wchar_t>>(loc).widen(str.data(),
str.data() + str.size(),
buf.data());
return std::wstring(buf.data(), buf.size());
}
std::wstring s2ws(const std::string& str)
{
using convert_typeX = std::codecvt_utf8<wchar_t>;
std::wstring_convert<convert_typeX, wchar_t> converterX;
return converterX.from_bytes(str);
}
std::string ws2s(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);
}
static const int kTextSize = 10;
bool FormatText(std::string* txt) {
if (NULL == txt) {
return false;
}
std::cout << "before:" << *txt << std::endl;
std::wstring w_txt = s2ws(*txt);
std::cout << "wstring size:" << w_txt.size() << std::endl;
std::cout << "string size:" << (*txt).size() << std::endl;
if (w_txt.size() > kTextSize) {
w_txt = w_txt.substr(0, kTextSize);
*txt = ws2s(w_txt);
*txt += "...";
}
std::cout << "after:" << *txt << std::endl;
return true;
}
// convert UTF-8 string to wstring
std::wstring utf8_to_wstring (const std::string& str)
{
std::wstring_convert<std::codecvt_utf8<wchar_t>> myconv;
return myconv.from_bytes(str);
}
void main()
{
ROS_INFO_STREAM("begin testcode!!!");
if(false)
{
assert(L"" == s2ws(""));
std::string txt = "龙之谷app好玩等你";
assert(24 == txt.size());
std::wstring w_txt = s2ws(txt);
assert(10 == w_txt.size());
assert("" == ws2s(L""));
w_txt = L"龙之谷app好玩等你";
assert(10 == w_txt.size());
txt = ws2s(w_txt);
assert(24 == txt.size());
txt = "龙之谷app公测开启";
std::string format_txt = txt;
FormatText(&format_txt);
assert(txt == format_txt);
txt = "龙之谷app公测火爆开启";
FormatText(&txt);
format_txt = "龙之谷app公测火爆...";
assert(format_txt == txt);
return;
}
{//test
// setlocale(LC_ALL, ".936");
std::string str("");
stringstream ss;
const char* pD = str.c_str();
for(int i=0; i < str.size(); ++i){
uint8_t ui = pD[i];
int x = ui * 1;
ss << "data[" <<i << "]:" << std::hex << (uint)ui << "-";
}
wstring wstr = s2ws(str);
std::wstring wstr1 = L"黄";
std::wcout.sync_with_stdio(false);
std::wcout.imbue(std::locale("en_US.utf8"));
std::wcout << L"w:"<< wstr << L"-" << wstr1 << std::endl;
return;
bool bResult = false;
peripheral_device_ftp::VehicleNumber l_srv;
if(m_pltNumSrvClient.call(l_srv)){
if(l_srv.response.ImagePath.empty()){
ROS_WARN_STREAM(" Service return empty path:" << l_srv.response.ImagePath);
}
else{
// ROS_INFO_STREAM("plate num:" << l_srv.response.VehicleNumber << ", path:" << l_srv.response.ImagePath);
// plateNum = l_srv.response.VehicleNumber;
string oriFileName = l_srv.response.ImagePath;
}
}
return;
}
}
(http://www.cplusplus.com/forum/beginner/126557/)