Portál AbcLinuxu, 19. dubna 2024 09:00


Dotaz: Konverzia unicode znaku na dva chary (utf-8)

18.6.2008 00:52 ...............23 | skóre: 15 | blog: Various Stuff blog
Konverzia unicode znaku na dva chary (utf-8)
Přečteno: 539×
Odpovědět | Admin
V týchto veciach sa moc nevyznám ale snáď sa vyjadrím správne:
Potrebujem nejakú funkciu (ideálne by bolo C makro) na konverziu jedného 16-bitového unicode znaku, napr. 0x00fd na dva 8-bitové znaky podľa UTF-8, v tomto prípade by to napríklad boli 0xc3 a 0xbd. Opačnú konverziu (dva chary na unicode znak) som vyhrabal v kóde SDL_ttf, ale toto som nikde nenašiel. Vďaka za každú odpoveď.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

18.6.2008 05:10 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
Odpovědět | | Sbalit | Link | Blokovat | Admin
neslo by na to nasroubovat knihovnu iconv?
In Ada the typical infinite loop would normally be terminated by detonation.
18.6.2008 11:17 ...............23 | skóre: 15 | blog: Various Stuff blog
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
hm, no funkcia iconv chce na vstupe pointer na pole charov, takže už to chce asi v tvare po dvojiciach bajtov...
18.6.2008 08:27 rastos | skóre: 62 | blog: rastos
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
Odpovědět | | Sbalit | Link | Blokovat | Admin
wctomb(). Pozor, vplyv má nastavenie locale (buď premenné prostredia LC_* a LANG, prípadne volanie funkcie setlocale() )
18.6.2008 11:26 ...............23 | skóre: 15 | blog: Various Stuff blog
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
wctomb vyzerá že by to mohlo byť ono, ale stále mi to vracia -1 :-)

proste ja by som potreboval opačnú operáciu k tomuto
#define TO_UNICODE(c1, c2) ((Uint16)(((unsigned char)c1)&0x1F) << 6 | (Uint16)(((unsigned char)c2)&0x3F))
ale asi nakoniec tie znaky nechám v unicode a upravím pár funkcií na prácu s nimi, bude to rýchlejšie...
18.6.2008 12:13 petr_p | skóre: 59 | blog: pb
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jste si jistý, že všechny UCS-2 znaky je možné zakódovat do 2 B UTF-8?
18.6.2008 12:21 ...............23 | skóre: 15 | blog: Various Stuff blog
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
Do 2 bajtov samozrejme nie, ale viacbajtové znaky (japonské a podobné hovadiny) zatiaľ nepotrebujem :-)
18.6.2008 16:52 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
I české texty ale nebudou mít v UTF-8 všechny znaky dvoubajtové – spodní polovina ASCII tabulky se kóduje v UTF-8 do jednobajtových znaků.
18.6.2008 18:27 ...............23 | skóre: 15 | blog: Various Stuff blog
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
Konvertujem len znaky ktoré nie sú v ASCII... Proste pri stlačení klávesu dostanem unicode číslo toho znaku a potrebujem ho skonvertovať na UTF-8, viď tu http://www.libsdl.org/cgi/docwiki.cgi/SDL_keysym

Druhá možnosť by bola nechať tie data v unicode, ale to by som musel upraviť istú časť kódu ktorý už mám...
18.6.2008 19:13 Andrej Herceg | skóre: 43
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
Odpovědět | | Sbalit | Link | Blokovat | Admin
Možno by sa dalo použiť niečo takéto (nerieši sa tam endianness):
#include <stdio.h>

#define FROM_UNICODE(c, c1, c2, c3) \
if ((Uint16)(c) <= 0x7f) { \
	c1 = (unsigned char)(c); \
	c2 = c3 = 0; \
} else if ((Uint16)(c) <= 0x7ff) { \
        c1=(unsigned char)(((c) >> 6) | 0xc0); \
        c2=(unsigned char)(((c) & 0x3f) | 0x80); \
        c3 = 0; \
} else if ((Uint16)(c) <= 0xd7ff) { \
        c1=(unsigned char)(((c) >> 12) | 0xe0); \
        c1=(unsigned char)((((c) >> 6) & 0x3f) | 0x80); \
        c3=(unsigned char)(((c) & 0x3f) | 0x80); \
} else { \
	c1 = c2 = c3 = 0; \
}

typedef unsigned short int Uint16;

int main(void)
{
	Uint16 z = 0xfd;
	unsigned char c1, c2, c3;

	FROM_UNICODE(z, c1, c2, c3);

	printf("%x, %x %x %x\n", z, c1, c2, c3);
	return 0;
}
Ja by som tam pravdepodobne používal originálne dáta v UCS-2 alebo v UTF-16 (alebo čo sa to tam vlastne používa).
18.6.2008 19:47 ...............23 | skóre: 15 | blog: Various Stuff blog
Rozbalit Rozbalit vše Re: Konverzia unicode znaku na dva chary (utf-8)
Super, díky moc! To je presne čo som potreboval.

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.