繁体   English   中英

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

[英]mbstowcs Returns -1 on Red Hat Linux But Not on Solaris

我们的服务器最初是在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"

这是我在尝试使用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)必须与字符串的编码相对应。 如果您不使用UTF-8字符串,则需要进行其他一些nl_langinfo检查

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM