mbstowcs在Red Hat Linux上返回-1但在Solaris上不返回

时间:2013-11-08 16:46:15

标签: c++ linux redhat

我们的服务器最初是在Solaris上运行的。我们一直在进行更改,因此它可以在Linux上运行(当前环境是Red Hat Linux),由于某种原因,mbstowcs无效。我已经确认代码中至少有两个位置,一个是这个:

template<class ParamType>
CLStatus Convert(const ParamType &xParam, std::wstring &xStr)
{
    std::stringstream strStream;
    strStream.str("");
    strStream << xParam;
    size_t length = mbstowcs(NULL, strStream.str().c_str(), 0);
    wchar_t *buffer = new wchar_t[length + 1];
    mbstowcs(buffer, strStream.str().c_str(), length);

如果xParam包含变音符号,则length最终为-1。这个代码适用于Solaris,但不适用于Linux。有人有什么想法吗?

我查看他们是否使用了不同的区域设置,但两者都在使用LC_ALL="en_US"

1 个答案:

答案 0 :(得分:0)

这是我在尝试使用UTF-8多字节字符串之前所做的事情:

static int mbr_utf8_init() {
  if (NULL == setlocale(LC_CTYPE, "")
      || 0 != strcmp(nl_langinfo(CODESET), "UTF-8")) {
    fprintf(stderr,
            "%s\n",
            "Unable to use UTF-8; trying changing LANG to a Unicode locale");
    exit(1);
  }
  return 0;
}

如果不调用setlocale(LC_CTYPE, ""),则无论任何环境变量的设置如何,都将保留在程序初始化时设置的“C”语言环境中。 ""的第二个参数setlocale表示“使用环境变量指定的语言环境”;如果您愿意,可以将语言环境强制为特定值。 (关于标准C语言环境接口有很多东西;其中一个是字符编码被认为是语言环境的一部分,而不是字符串类型。这使得处理不同编码的文件很烦人。但我离题了。)

在Linux上,C语言环境不喜欢基本字符集之外的字符。 Solaris可能不同。

使用上面的代码,环境中设置的语言环境(或至少LC_CTYPE)必须与string的编码相对应。如果您不使用UTF-8字符串,则需要进行其他nl_langinfo检查