Linux 输出宽字符相关

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"

Windows WCHAR 到 Linux wchar_t 字符类型的转换

猜你喜欢

转载自blog.csdn.net/wsp_1138886114/article/details/128819176