在将大型应用程序从 Windows 移植到 Linux 时,我需要能够在宽字符和多字节字符之间进行转换。为此,我的代码如下所示:
void IConv(const InType* begin, const InType* end, const char* inCode, OutType* outBegin, OutType*& outEnd, const char* outCode)
{
assert(end >= begin);
assert(outEnd > outBegin);
iconv_t cd = iconv_open(outCode, inCode);
if (cd == reinterpret_cast<iconv_t>(-1))
throw (InvalidLocale ());
/* blah, blah, blah other code we never reach */
}
该代码总是抛出异常。为了调试它,我创建了一个更简单的版本,它使用与失败代码相同的参数。这是我的测试代码
int main( void )
{
const char outCode[] = "";
const char inCode[] = "wchar_t";
//Using wchar_t and "" means that iconv will just use the system locale settings.
iconv_t cd = iconv_open(outCode, inCode);
if (cd == reinterpret_cast<iconv_t>(-1))
{
printf("iconv failed to use outCode %s and inCode %s\n",outCode, inCode);
return 1;
}
iconv_close(cd);
return 0;
}
请注意,代码几乎相同。但是在我的测试代码中,我从来没有看到失败,而 IConv 函数总是失败。系统上的语言环境是通过 LANG 环境变量设置的,在这种情况下始终为 ISO-8859-1。
所以,问题是,有没有人知道 iconv 中可能出现在大型应用程序中的任何特定行为,但不是在简单的情况下?谢谢