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