isprint() vs diakriticka znamenka
Petr Kolar
PETR.KOLAR na vslib.cz
Pondělí Září 7 09:37:43 CEST 1998
chaky na goliash.inext.cz (Michal Hucik) wrote:
> poslal jsem autorovi builderu 'glade' (GUI v gtk) bug report, ve
> kterem jsem si stezoval na to, ze pokud napisu nejaky label v cestine, tak
> dojde pri vytvareni zdrojoveho kodu k prekodovani diakritickych znamenek na
> hexakody, na coz reaguje gcc pri kompilaci warningem 'escape sequence out of
> range for character' a cestina je ve vyslednem kodu uplne rozbita ...
> Pozadal mne o patch, ale i kdyz se jedna o zcela banalni problem, tak si
> nejsem tak uplne jisty tim, jake reseni je korektni.
>
> Puvodni kod:
> ----------------
> gchar *p;
> gchar escape_buffer[16];
>
> ..
> ..
> ..
>
> if(isprint(*p))
> /*char se nezmeni a zapise se do vystupu*/
> else {
> sprintf (escape_buffer, "\\x%02x", *p);
> /* do vystupu se zapise escape_buffer */
> }
> ----------------
>
> Mozna oprava:
> ----------------
> if((unsigned char) *p >= ' ')
^^^^^^^^^^^^^^^^^^^^^^^^
JEN TO NE!!!
> /*char se nezmeni a zapise se do vystupu*/
> else
> sprintf (escape_buffer, "\\x%02x",(unsigned char) *p);
> /* do vystupu se zapise escape_buffer */
> }
> ----------------
>
> Tato oprava funguje spravne, ale nejsem si tak uplne jisty tim, ze bude
> chodit napr. v japonske lokalizaci, nebo na jinych OS ... Neda se nejak
> vycucnout z locales to, ktere znaky jsou printable?
K tomu prave slouzi isprint(). Jenom je potreba inicializovat locales:
#include <locale.h>
...
void
main()
{
setlocale(LC_ALL, "");
...
atd.
Navim, jestli neni potreba delat jeste nejake tanecky okolo toho, jestli
je nastavene LANG, ale treba textutils to takhle delaji, takze to asi staci.
Jestli to chce nekdo zkouset, tak na pocestenych systemech s libc-5 muze
narazit:
Pokud takto upravene programy zacnou hazet core dump (v nekterych
verzich libc-5 a pri nastavenem LC_ALL na cs), je pricina ve spatnem
souboru cs/LC_CTYPE v adresari, ktery se vypise prikazem localedef --help
(soubor ma nulovou delku). Pokud nemate moznost vyrobit tento soubor
spravny, je treba ho smazat. Je to chyba v libc-5, ktera zpusobuje, ze
program localedef pri prekladu locales spadne a prazdny soubor LC_TIME pak
zpusobuje havarie vsech lokalizovanych aplikaci. V libc-5 take nefunguje
spravne treba isalnum().
S glibc nejsou v tomto smeru zadne problemy.
S pozdravem
--
*** Petr Kolar ***
Department of Information Technologies, Technical University of Liberec
Voronezska 1329, 461 17 Liberec, Czech Republic
Phone: +420-48-535-2371 Fax: +420-48-535-2229
E-mail: Petr.Kolar na vslib.cz http://asterix.vslib.cz/staff/kolar.html
Další informace o konferenci Linux