Есть функция конвертации строки:
char* convertString(const char* inputString, const char* codePageFrom, const char* codePageTo, size_t &len)
{
iconv_t iconvHandle = iconv_open(codePageTo, codePageFrom);
if (iconvHandle == (iconv_t)-1)
{
fprintf(stderr, "iconv: cannot convert from %s to %s!\n", codePageFrom, codePageTo);
return NULL;
}
size_t inputStringLength = strlen(inputString);
size_t outputBufferSize = inputStringLength;
char* inputBuffer = (char*)malloc(inputStringLength + 1);
strcpy(inputBuffer, inputString);
char* outputBuffer = (char*)malloc(outputBufferSize + 1);
char* outBuf = outputBuffer;
size_t errorCode = iconv(iconvHandle, &inputBuffer, &inputStringLength, &outBuf, &outputBufferSize);
if (errorCode == -1ull)
{
fprintf(stderr, "iconv: conversion failed!\n");
iconv_close(iconvHandle);
return NULL;
}
if (errno != 0)
{
fprintf(stderr, "iconv: %s\n", strerror(errno));
iconv_close(iconvHandle);
return NULL;
}
iconv_close(iconvHandle);
len = strlen(outputBuffer);
return outputBuffer;
}
Вызываю так:
int main()
{
size_t stringLength;
char* chars = convertString("я", "UTF-8", "cp1251", stringLength);
std::cout << "ok " << (int)chars[0] << std::endl;
return 0;
}
Работает, вроде, правильно.
Но если перед вызовом вызвать ещё glfwInit
, то есть вот так:
int main()
{
glfwInit();
size_t stringLength;
char* chars = convertString("я", "UTF-8", "cp1251", stringLength);
std::cout << "ok " << (int)chars[0] << std::endl;
return 0;
}
Выдаёт ошибку:
iconv: Permission denied
Ошибка сегментирования (стек памяти сброшен на диск)
Если перенести вызов конвертации в одну из последующих функций (например, в функцию вывода текстурного шрифта), то выдаёт уже следующее:
iconv: Resource temporarily unavailable
Ошибка сегментирования (стек памяти сброшен на диск)
Есть подозрение, что в функции convertString
я неправильно выделяю память Но по-другому оно не работает Возвращает строку с нулями (ошибок в консоли при этом нет).
Код взял отсюда:
Если скопипастить код, ничего в нем не меняя, и вызвать вот так:
int main()
{
glfwInit();
char* chars = convert("я", "UTF-8", "cp1251");
std::cout << "ok " << (int)chars[0] << std::endl;
return 0;
}
выдаёт:
iconv: Permission denied
ok -1
То есть, выдаёт ошибку и правильный результат.
p.s. Это всё в линуксе.
p.p.s. " Ошибка сегментирования" это, видимо, потому что я обращаюсь к chars
, который равен NULL
. А вот другие ошибки непонятны