Portál AbcLinuxu, 12. května 2025 10:48

Dotaz: Převod UTF-8 na cp1250 v C

4.2.2009 11:16 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Převod UTF-8 na cp1250 v C
Přečteno: 2597×
Odpovědět | Admin

Potřebuji převést string - řetězec znaků z UTF-8 na cp1250 a nevím jak na to - jakou funkci použít v C.

Kdyby to bylo pouze překodování znaku je to bez problému, ale problém je že je to UTF-8 takže tam znak může být různě dlouhý a na to nevím jakou funkci v C použít - nikdy jsem s unicode nedělal.

Nebo to převést na pevnou délku tj UTF-8 na UNICODE (UTF-16) a porovnávat to potom a nahrazovat ?

Prostě mám program který mi převádí data z linuxu pro PocketPC a potřebuji překodovat znakovou sadu.

Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

4.2.2009 11:38 jiri-j
Rozbalit Rozbalit vše Re: Převod UTF-8 na cp1250 v C
Odpovědět | | Sbalit | Link | Blokovat | Admin

možná vám pomůže man 3 iconv

4.2.2009 14:26 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: Převod UTF-8 na cp1250 v C
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nebo to převést na pevnou délku tj UTF-8 na UNICODE (UTF-16) a porovnávat to potom a nahrazovat ?

BTW., UTF-16 není Unicode (je to formát kódování používané pro kódování Unicode) a UTF-16 nemá pevnou délku znaků.

4.2.2009 19:58 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Převod UTF-8 na cp1250 v C

Jasně trochu se v tom ještě neorientuji pod MS-DOS jsem s UNICODE nedělal :-) v tu dobu nebyl.

Limoto avatar 4.2.2009 16:48 Limoto | skóre: 32 | blog: Limotův blog
Rozbalit Rozbalit vše Re: Převod UTF-8 na cp1250 v C
Odpovědět | | Sbalit | Link | Blokovat | Admin

iconv()? viz Wikipedie

4.2.2009 19:59 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Převod UTF-8 na cp1250 v C

Jasně to asi bude ono - jdu se na to kouknout co to dělá.....

26.2.2009 13:52 Petr Šobáň | skóre: 80 | blog: soban | Olomouc
Rozbalit Rozbalit vše Re: Převod UTF-8 na cp1250 v C
Tak jsem tam dodělal funkci kterou jsem vykrad z jednoho příkladu:

#define DELKA_POZNAMKY 256

char convStr[DELKA_POZNAMKY];

...........

/* převod kodování */

char * UTF8toWindows (char * from)
{
    char *p1, *p2;
    iconv_t i;
    size_t fromlen, tolen;
    size_t iconv_value;

    errno=0;
	
    if (strlen(from) > DELKA_POZNAMKY) {
	perror("ICONV: Poznámka je moc dlouhá.");
        exit(errno);
    }


    memset(convStr,0,sizeof(convStr));
    tolen = fromlen = strlen(from);
    p1 = (char *)from;
    p2 = (char *)convStr;

    i = iconv_open("WINDOWS-1250", "UTF-8");
    if (i == (iconv_t) -1) {
        if (errno == EINVAL)
	  perror("ICONV: Nepodporuji převod z UTF-8 do CP1250.");
	else
	  perror("ICONV: Chyba převodu kodování.");
          exit(errno);

    }



    /* Převod */
    /* iconv_value = iconv(i, (const char **)&p1, &fromlen, &p2, &tolen); */
    iconv_value = iconv(i, &p1, &fromlen, &p2, &tolen);
    if (iconv_value == (size_t) -1) {
        perror ("ICONV: Převod kodování se nepovedl.");
	exit(errno);
    }
    iconv_close(i);
    return(convStr);
}

........

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.