Странное поведение iconv_open в Linux - PullRequest
2 голосов
/ 05 марта 2012

При переносе большого приложения с 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 env, которая в этом случае всегда ISO-8859-1.

Итак, вопрос в том, знает ли кто-нибудь какое-либо конкретное поведение в iconv, которое может представлять себяв большом приложении, но не в простом случае?Спасибо

1 Ответ

2 голосов
/ 05 марта 2012

Возможно, проблема в том, что на целевом компьютере не установлены соответствующие библиотеки iconv и индексы.Смотри /usr/lib[64]/gconv.Общие библиотеки обычно являются частью установки glibc.Такие инструменты, как localedef, могут создавать их.

...