GTK + kódlapok

 ( nzmark | 2006. január 16., hétfő - 15:13 )

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

le lehet beszélni az utf8 használatáról? nekem kifejezetten az kéne, hogy sehol (label, textview) ne használjon utf8 -as kódolást

[quote:4029f346c5="nzmark"]le lehet beszélni az utf8 használatáról? nekem kifejezetten az kéne, hogy sehol (label, textview) ne használjon utf8 -as kódolást[/quote:4029f346c5]
A gtk+ 2-t nem. Az mindenhol UTF8-ban gondolkodik. Miért baj ez neked? A ki- és bemenetet (fájlokat, kezelt adatokat stb.) közvetlen beolvasásuk után, illetve közvetlen kiírásuk előtt át lehet alakítani Latin2-re vagy amire éppen szeretnéd, viszont belül az összes szövegmegjelenítő meg ilyesmi mindenképpen UTF-8-at használ.

[quote:91c760f76b="egmont"][quote:91c760f76b="nzmark"]le lehet beszélni az utf8 használatáról? nekem kifejezetten az kéne, hogy sehol (label, textview) ne használjon utf8 -as kódolást[/quote:91c760f76b]
A gtk+ 2-t nem. Az mindenhol UTF8-ban gondolkodik. Miért baj ez neked? A ki- és bemenetet (fájlokat, kezelt adatokat stb.) közvetlen beolvasásuk után, illetve közvetlen kiírásuk előtt át lehet alakítani Latin2-re vagy amire éppen szeretnéd, viszont belül az összes szövegmegjelenítő meg ilyesmi mindenképpen UTF-8-at használ.[/quote:91c760f76b]

hogyan lehet konvertálni? nekem az kéne, hogy mondjuk az ő betű, vagy akármilyen spéci karakter férjen el 1bájton, mint annó régen :-) karakter előfordulás grafikont rajzolok és ehhez használok egy karakter tömböt. [255] kiolvasom a textview tartalmát és a betűk kódjának megfelelő helyen a tömbben növelem az értéket, ami alapján rajzolom a diagramot. egy spéci betű pedig igencsak bezavar ennek. szóval én azt szeretném, hogy ne legyenek utf8 -as kódok, hanem 0-255 között legyen egy karakter kódja és 1bájtos legyen.

[code:1:68a26fc55c]G_FILENAMES_ENCODING[/code:1:68a26fc55c]

és az összes G_ környezeti változó a barátod, ha jól rémlik minden szépen le van írva GTK+ doksiban, de most éppen win alatt vagyok ezért nem tudom meglesni

[quote:3ed7340f6d="nzmark"]le lehet beszélni az utf8 használatáról? nekem kifejezetten az kéne, hogy sehol (label, textview) ne használjon utf8 -as kódolást[/quote:3ed7340f6d]

Nem, de:
g_locale_from_utf8();
g_convert();

"ISO-8859-2" -be "belefersz" akkor meg is vagy.

Na jó.. konvertálok agyba főbe, de mégsem jön össze, amit szeretnék, pedig nem bonyolult dologra vágyok.

egy textview -be beviszek egy szöveget.. mondjuk legyen csak egy 'a' betű. rákattintok egy gombra ami egy tömbbe a megfelelő elemet egyel növeli, méghozzá az 'a' betű kódjának (97) megfelelő tömbelemet. van egy tömböm, ami 256 elemű, és így a tömb 97-edik elemét egyel növelem. ez tök egyszerű és szépen működik is. viszont ha 'ö' betűt írok be, akkor a beolvasott karaktert ha integerként iratom ki, akkor -10 lesz. miért?? valami kódja ennek is kell, hogy legyen. előtte átkonvertáltam ISO-8859-2 -be de csak -10 marad az 'ö' betű kódja.

nem az a bajod, hogy
signed char betu;
vagy
char betu;
-t használsz?
szerintem az
unsigned char betu;
a te barátod

köszönöm szépen, valóban ez volt. megcsináltam simán C-ben GTK nélkül ezt a részt és ott is negatív számokat kaptam, aztán jöttem rá, hogy 127 fölöttiekre adja a negatívot, így aztán nekem is összeállt a kép, hogy a deklarációval van a gond. nagyon szépen köszönöm a segítségedet!

Mondjuk arra illik odafigyelni és tesztelni, hogy ha latin2-re nem alakítható karaktereket kapsz, akkor (ha a statisztikába nem is számolod be őket) nem csinál hülyeséget a program, nem száll el vagy ilyesmi, hanem épeszűen kezeli a szitut (csendben továbbáll a következő karakterre, vagy dob egy hibaüzenetet stb...)

Újabb kódlapos dologban kérném a segítséget. hogyan tudok egy ismeretlen kódolású sztringet UTF-8 -assá alakítani?

jozan paraszti eszem azt mondja sehogy.

Akkor egy kódoló algoritmus által készített encyptált sztringet hogyan tudok megjeleníteni egy GTK programban? (textview -ban) valahogy csak ki lehet iratni. mondjuk jelenleg átalakítom HEX -ává és úgy teszem, no de valahogy csak ki lehet írni sztringként is.

Hat sok ertelme lehet...

De te tudod... Nezz korul pl.: glib: g_convert, csak valami olyan kiindulo kodolast kell valasztani amiben minden char-nak van utf8 megfeleloje... Nem tudom, hogy az altalad hasznalt encryptalo algoritmus ad-e ki 32 alatti dolgokat. a NUL-lal pedig valoszinu igencsak nagy problemaid lesznek...

Zsiraf

p.s.: amugy vagy regulazd meg az algoritmust >31 <127, vagy csinalj egy egyszeru tablacskut, amibol az altalad valasztot utf8-kodokat tudod berakni a kenyes karakterek helyett...

Gondoltam megjeleníteném úgy, mint amikor egy fájlt megnézel pl a midnight commanderrel. nyilván a változóban 0-255 -ig lennének bájtok, ezeket kellene megjeleníteni valahogy (HEX-án kívül mert azt már megcsináltam) persze mivel tudom a sztring hosszát, így lehet megpróbálom majd karakterenként átalakítani, amit meg nem lehet azt meg valamivel helyettesítem.

> valami olyan kiindulo kodolast kell valasztani amiben minden char-nak van utf8 megfeleloje...
Miért, melyik kódolásban van olyan karakter, aminek nincs utf8 megfelelője?

> Nem tudom, hogy az altalad hasznalt encryptalo algoritmus ad-e ki 32 alatti dolgokat. a NUL-lal pedig valoszinu igencsak nagy problemaid lesznek...
Speciel az ASCII 0-32 értékekkel az utf8-nak az ég-világon semmi baja sincsen.

Nem tudom hogy jól értem-e a problémát, illetve kétféleképp is el tudom képzelni.

1) Adott egy értlemes emberi szöveg, csak nem tudod, hogy milyen a kódolása. Viszonylag jó heurisztika szerintem, hogy leellenőrzöd hogy értelmes utf8-e, ha igen akkor utf8-nak feltételezed, ha pedig nem, akkor az aktuális locale végéről a .UTF-8 végződést lecsapva kapott locale karakterkészletét próbálod ki (például ha a ``setlocale(LC_CTYPE, NULL)'' azt adja válaszul, hogy "hu_HU.UTF-8", akkor ``setlocale(LC_CTYPE, "hu_HU")'', tehát az utf8 nélküli hagyományos locale-re váltasz ideiglenesen, és ennek a karakterkészletét (``nl_langinfo(CODESET)'') próbálod ki. Ha erről sem megy a konvertálás, akkor meg Latin-1-et feltételezel. Én párszor már lekódoltam ezt a heurisztikát. Addig egész jó, amíg nem az UTF8 locale-ek az alapértelmezettek. Ha majd egyszer pár év múlva kicsavarják a glibc-t, hogy a hu_HU lesz utf8-as és a hu_HU.iso-8859-2 lesz a latin2-es, akkor lesz jajj.

2) Adott egy nem értelmes emberi szöveg, hanem bináris adat, mondjuk egy végrehajtható progi, és ezt akarod valahogy úgy megjeleníteni, hogy minden byte-ot egy szimbólum ábrázol, az ASCII-t megtartva hogy azért a szövegrészletek felfedezhetők legyenek. Ez esetben egyszerűen feltételezz latin1 karakterkészletet.

Ha már itt járunk, azért megkérdezném, a GLib/GTK+ -től függetlenül:
Egy ismeretlen kódolású szövegnek hogyan lehet megtudni az érvényes karakterkódolását?
Nem az érdekel, hogy abban a kódolásban a szövegnek van -e bármiféle értelme, hanem az, hogy milyen kódolással érvényes egyátalán az a karaktersorozat.

A legtöbb kódolás karakterenként 1 byte, így ott minden érvényes.

Kérdésedre:
Ha arra vagy kíváncsi, hogy érvényes xyz karakterkészletű-e, akkor megpróbálhatod átalakítani iconv-val xyz-ről xyz kódolásra, vagy xyz-ről valami unicode-kompatibilisre (pl. ucs-4, utf-8). Ha sikerül, érvényes volt.

További ellenőrzés lehet, hogy nyomtatható-e. Például a 128-159 karakterek a Latin2-ben nem nyomtathatók a 0-31 karakterek túlnyomó többségéhez hasonlóan. Ebben a wcwidth(), wcswidth() lehet például a segítségedre.

Köszönöm, teljesen érthető, amit írtál.

Ugyanúgy, ahogyan egy ismeretlen nyelvű szót lefordítani magyarra. Például a "pain" szó magyar fordítása micsoda?