kiltum (kiltum) wrote,
kiltum
kiltum

Кажется, у меня лыжи не смазаны ...

Имеем желание прямо в программе перекодировать 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 ...

Какую смазку ещё надо покурить?
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 16 comments