string 与 wstring 的转换
#include <cstdlib>
#include <string.h>
#include <string>
// wstring => string
std::string WString2String(const std::wstring& ws)
{
std::string strLocale = setlocale(LC_ALL, "");
const wchar_t* wchSrc = ws.c_str();
size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1;
char *chDest = new char[nDestSize];
memset(chDest,0,nDestSize);
wcstombs(chDest,wchSrc,nDestSize);
std::string strResult = chDest;
delete[] chDest;
setlocale(LC_ALL, strLocale.c_str());
return strResult;
}
// string => wstring
std::wstring String2WString(const std::string& s)
{
std::string strLocale = setlocale(LC_ALL, "");
const char* chSrc = s.c_str();
size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;
wchar_t* wchDest = new wchar_t[nDestSize];
wmemset(wchDest, 0, nDestSize);
mbstowcs(wchDest,chSrc,nDestSize);
std::wstring wstrResult = wchDest;
delete []wchDest;
setlocale(LC_ALL, strLocale.c_str());
return wstrResult;
}
Linux 输出宽字符
#include <iostream>
#include <string>
#include <locale>
using namespace std;
int main(void) {
std::wstring w = L"Out中文";
std::ios_base::sync_with_stdio(false);
std::wcin.imbue(std::locale("zh_CN.utf8"));
std::wcout.imbue(std::locale("zh_CN.utf8"));
std::wcout << w << std::endl;
}
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>
int main(void) {
wchar_t w[] = L"Out中文";
setlocale(LC_ALL, "zh_CN.UTF-8");
wprintf(L"%ls/n", w);
return 0;
}
Linux 输出问题及解决方法
terminate called after throwing an instance of ‘std::runtime_error’
what(): locale::facet::_S_create_c_locale name not valid
解决方法一:export LC_ALL="C"
解决方法二:安装中文语言包支持
$
sudo dpkg-reconfigure locales
Generating locales (this might take a while)…
en_US.UTF-8… done
zh_CN.GB2312… done
zh_CN.GB18030… done
zh_CN.GBK… done
zh_CN.UTF-8… done
Generation complete.
解决方法三:编译参数:
set(CMAKE_CXX_FLAGS "-std=c++17 -finput-charset=UTF-8 -fexec-charset=GBK ${CMAKE_CXX_FLAGS}")
LANG设置
LANG="en_US.UTF-8:en_US:en_US.ISO-8859-1"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN:en:en_US:en_US.UTF-8"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:zh_TW.Big5:zh_TW:zh:en_US.UTF-8:en_US:en:en_US.ISO-8859-1"