Имеем желание прямо в программе перекодировать KOI8-R в UTF-8. Мелочное такое желание. Но вот охота его удовлетворить и все тут. А неудовлетворяется ...
Обчитавшись манов и просмотрев кучку примеров, рисуем следующе:
#include <stdio.h>
#include <stdlib.h>
#include <iconv.h>
#include <locale.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>
int main(void)
{
char inBuffer[9] = {'t','e','s','t',' ',0xF2,0xDC,0xCA,0}; // "test Рэй" in koi8
size_t inSize = sizeof inBuffer;
char outBuffer[80];
size_t outSize = sizeof outBuffer;
char* in = inBuffer;
char* out = outBuffer;
setlocale(LC_ALL,"ru_RU.KOI-8");
memset(out,0,outSize);
iconv_t trans=iconv_open("koi8-r","utf-8");
if(trans==(iconv_t)-1) { printf("iconv set failed\n"); exit(1); }
size_t ico=iconv(trans, &in, &inSize, &out, &outSize);
if(ico==(size_t)-1) { printf("iconv err: %s\n",strerror(errno)); }
printf("%s\n",outBuffer);
iconv_close(trans);
return 0;
}
Компилируем gcc test.cpp -lstdc++
Запускаем ./a.out
Получаем.
iconv err: Invalid or incomplete multibyte or wide character testА должны были "test Рэй" получить на уникоде. результат от setlocale не зависит. Такое впечатление, что iconv отказывается понимать верхнюю половину таблицы ASCII ...
Какую смазку ещё надо покурить?