我要实现两个函数,在string与wstring之间转换,程序运行在linux centos7中 gcc版本4.8.5
下面是我的实现,如果去掉ws2s中setlocale(LC_ALL,"");,转换失败。
关于setlocale这块不熟悉,man手册看的有点晕,我想问下如下这两个函数写法有没有问题,使用setlocale会不会改变系统的某些行为,影响别的程序运行,是否setlocale可以提到main函数中在程序开始只执行一次,而不用每调用一次函数就执行一次?
man手册里有如下内容:
If locale is an empty string, "", each part of the locale that should
be modified is set according to the environment variables. The
details are implementation-dependent.
是不是意味着我在不同的电脑上运行,程序运行结果有可能不一样,如何确定呢?比如我要转换wchar 和char处理xml中的中文,由于tinyxml2接口是char,因此需要转换。
/*
string converts to wstring
*/
std::wstring s2ws(const std::string& src)
{
std::wstring res = L"";
size_t const wcs_len = mbstowcs(NULL, src.c_str(), 0);
std::vector<wchar_t> buffer(wcs_len + 1);
mbstowcs(&buffer[0], src.c_str(), src.size());
res.assign(buffer.begin(), buffer.end() - 1);
return res;
}
/*
wstring converts to string
*/
std::string ws2s(const std::wstring & src)
{
setlocale(LC_ALL,"");
std::string res = "";
size_t const mbs_len = wcstombs(NULL, src.c_str(), 0);
std::vector<char> buffer(mbs_len + 1);
wcstombs(&buffer[0], src.c_str(), buffer.size());
res.assign(buffer.begin(), buffer.end() - 1);
return res;
}
setlocale本身就只需要在程序运行之初调用一次就行,并且只影响当前进程的locale设置,不会影响系统。
如下是clocale 的说明,是针对链接到c动态库的程序
http://www.cplusplus.com/refe...
其中一开头有一句话“Sets locale information to be used by the current program, either changing the entire locale or portions ....”
影响当前进程。
另外你上面用的是c++,c++ 运行时有自己独立于clocale(通过setlocale(LC_AL,"") 或者setlocale(LC_ALL"C")并链接到c运行时)的locale,虽然使用方式看似类似,但是还得注意区别。