mbstowcs 在 Red Hat Linux 上返回 -1,但在 Solaris 上不返回
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,
"%sn",
"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
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 返回实例变量的c++方法可以访问变量中的数据,但不能更改它,但在编译时不会生成错误
- 使用 Libusb 1.0 发送中断传输会返回LIBUSB_ERROR_IO,但在接收时不会
- 如何调试正常运行但在 ide 中返回分段错误的程序?
- FCGX_GetParam REQUEST_METHOD可以在Windows中使用,但在Linux中返回NULL
- GCC 中的编译器错误,但在将 decltype 与具有尾随返回类型语法的模板化成员函数一起使用时没有 clang
- 如何在调试版本中测试断言,但在发布中返回值
- 为什么地板(POW(64,1.0/3))返回3但在C 中卸下地板()时打印4
- 为什么将boost::move()的返回值分配给非常数引用在C++0x模式下失败,但在C++03模式下有效
- c++GetSystemTime在调试时返回0,但在遍历断点时返回正确的输出
- mbstowcs 在 Red Hat Linux 上返回 -1,但在 Solaris 上不返回
- 为什么这个条件返回 false,但在主函数中它返回 true
- 在OS X中从main返回时出现中止陷阱6,但在linux中没有
- 从指针到法向量的转换在main函数中工作,但在从函数返回时不起作用
- string.find() 在使用 ==-1 时返回 true,但在使用 <0 时返回 false
- "成员是私有的",尽管我不从外部访问它,但在使用尾随返回类型时
- std::exception. .()在clang和gcc上返回意外值,但在VS11上没有
- OpenGL glGetUniformLocation for Sampler2D在树莓派上返回-1,但在Windows
- 由于ECHILD错误,C++中的system()函数在一段时间内运行良好,但在返回-1时失败.为什么?
- 将opengl窗口转换为std::size_t并再次返回在Linux中有效,但在OS X中无效