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

标签 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"

最佳答案

这是我在尝试使用 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 语言环境接口(interface)有很多问题;其中之一是字符编码被认为是语言环境的一部分,而不是字符串类型。这使得处理不同编码的文件变得很烦人。但我离题了。)

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

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

关于c++ - mbstowcs 在 Red Hat Linux 上返回 -1,但在 Solaris 上不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19864304/

相关文章:

linux - sed + 如何使用缩进附加行

c++ - FreeLibrary 与隐式卸载 DLL

linux - 如何使用 Linux 命令创建没有重复(未排序)的文件?

java - 如果使用了 waitFor,为什么杀死 JVM 也会终止其子进程?

linux - perl加密脚本IDEA

linux - 如何监控和记录 mt apache 网络服务器的 session

python-3.x - IPython notebook 总是显示 "kernel starting, please wait..."

c++ - 从 Maya 场景中的现有对象名称构造 MObject

c++ - 这个宏函数是什么意思呢?

c++ - 我们在 std::map 或 std::set 中有什么样的排序?