wstring 与string转换 ,函数setlocale用法疑问

我要实现两个函数,在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;
}
阅读 3.2k
1 个回答
新手上路,请多包涵

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,虽然使用方式看似类似,但是还得注意区别。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题