isalpha + setlocale

Dieses Thema im Forum "C/C++" wurde erstellt von Nerthus, 10.11.2006.

  1. #1 Nerthus, 10.11.2006
    Nerthus

    Nerthus Jungspund

    Dabei seit:
    06.07.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Hallo,

    ist es möglich die locale eines C-Programms (mit setlocale(LC_CTYPE, "charset"))
    so einzustellen, daß einige Makkros aus ctype.h auch die Umlaute "äÄöÖüÜ" als
    normale Zeichen erkennen? Wenn ja, welcher Zeichensatz muß dazu verfügbar sein?

    locale -a unter linux spuckt das folgede aus:

    Keiner dieser (deutschen) Zeichensätze als Argument für setlocale() funktionert.
    setlocale() liefert zwar immer einen Zeiger auf die übergebene Zeichenkette
    zurück, aber isalpha() weigert sich dennoch Umlaute als normale Zeichen anzuerkennen!

    bye
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. gonso

    gonso Grünschnabel

    Dabei seit:
    10.11.2006
    Beiträge:
    7
    Zustimmungen:
    0
    Code:
    #include <stdio.h>
    #include <ctype.h>
    #include <locale.h>
    
    int main()
    {
    	setlocale(LC_CTYPE,"de_DE");
    	if(isalpha('Ä'))
    		printf("%c\n",'Ä');
    	return 0;
    }
    
     
  4. hwj

    hwj Doppel-As

    Dabei seit:
    23.06.2006
    Beiträge:
    131
    Zustimmungen:
    0
    Ort:
    Bei Buxtehude
    Unter OpenSuSE 10.2 (Beta) klappt das, unter FreeBSD 6.1 nicht ... auch wenn man statt "de_DE" einen installierten locale-String verwendet.

    Heiko
     
  5. gonso

    gonso Grünschnabel

    Dabei seit:
    10.11.2006
    Beiträge:
    7
    Zustimmungen:
    0
    Hmm, ist FreeBSD linux ? ;)
     
  6. #5 Nerthus, 14.11.2006
    Nerthus

    Nerthus Jungspund

    Dabei seit:
    06.07.2005
    Beiträge:
    16
    Zustimmungen:
    0
    @gonso

    Funktioniert leider nicht, soweit war ich auch schon. Beispiel :

    Code:
    #include <stdio.h>
    #include <locale.h>
    #include <ctype.h>
    
    main()
    {
    
      int c;
      c = 0x20;
      
      if (!setlocale(LC_ALL, "de_DE"))
        exit(1); 
    
       
         if(isalpha('Ä'))
    	 printf("%c\n",'Ä');
         else
           puts("no ascii!\n");
           
    
         while (c <= 0xFF) {
          printf(" %c ", c);
     
          if( ! ((c+1) % 24 ))
    	putchar('\n');
    
           c++;
    
         }
    
         puts("");
    
    }
    
    Ergibt folgende Ausgabe :

    Code:
    nerthus@ubuntu:~/coding/c/test$ gcc ascii.c
    ascii.c:15:21: Warnung: Zeichenkonstante mit mehreren Zeichen
    ascii.c:16:17: Warnung: Zeichenkonstante mit mehreren Zeichen
    nerthus@ubuntu:~/coding/c/test$ ./a.out
    no ascii!
    
        !  "  #  $  %  &  '  (  )  *  +  ,  -  .  /
     0  1  2  3  4  5  6  7  8  9  :  ;  <  =  >  ?  @  A  B  C  D  E  F  G
     H  I  J  K  L  M  N  O  P  Q  R  S  T  U  V  W  X  Y  Z  [  \  ]  ^  _
     `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w
     x  y  z  {  |  }  ~    \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff
     \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff
     \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff
     \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff
     \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff
     \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff  \uffff
    nerthus@ubuntu:~/coding/c/test$
    
    Das ist reiner 7-Bit Ascii-Code, da Zeichen > 127 nicht mehr erkannt werden.
    Es scheint so als ob trotz erfolgreichem Aufruf von locale(), nach wie vor die locale
    auf "C" gesetzt sind!?!
     
  7. gonso

    gonso Grünschnabel

    Dabei seit:
    10.11.2006
    Beiträge:
    7
    Zustimmungen:
    0
    Hmm hier schon
    Code:
    #include <stdio.h>
    #include <ctype.h>
    #include <locale.h>
    #include <stdlib.h>
    
    int main()
    {
    
      int c;
      c = 0x20;
      
      if (!setlocale(LC_ALL, "de_DE"))
        exit(1); 
    
       
         if(isalpha('Ä'))
    	 printf("%c\n",'Ä');
         else
           puts("no ascii!\n");
           
    
         while (c <= 0xFF) {
          printf(" %c ", c);
     
          if( ! ((c+1) % 24 ))
    	putchar('\n');
    
           c++;
    
         }
    
         puts("");
    	return 0;
    }
    
    Dann muss was an deinem system faul sein.
    ps.
    gcc --version
    gcc (GCC) 4.1.1 (Gentoo 4.1.1-r1)
     
  8. #7 Nerthus, 14.11.2006
    Nerthus

    Nerthus Jungspund

    Dabei seit:
    06.07.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Und was?
    Irgendeine Idee?

    bye

    Ps: Hab gcc2.95, gcc3.4.5 und gcc4.0 versucht. Immer mit selben Ergebnis!
     
  9. gonso

    gonso Grünschnabel

    Dabei seit:
    10.11.2006
    Beiträge:
    7
    Zustimmungen:
    0
    Speichert dein Editor die Datei im UTF-8 Format ?
     
  10. #9 Nerthus, 14.11.2006
    Nerthus

    Nerthus Jungspund

    Dabei seit:
    06.07.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Ja, tut er (emacs):

    Code:
    nerthus@ubuntu:~/coding/c/test$ file ascii.c
    ascii.c: UTF-8 Unicode C program text
    nerthus@ubuntu:~/coding/c/test$
    
     
  11. gonso

    gonso Grünschnabel

    Dabei seit:
    10.11.2006
    Beiträge:
    7
    Zustimmungen:
    0
    Jo, speicher es als iso8891ab .
    Deine console soll auch iso8891 zeigen.
    Keine Ahnung was $LANG zeigen muss, ob auch "de_DE" .
     
  12. #11 Nerthus, 14.11.2006
    Nerthus

    Nerthus Jungspund

    Dabei seit:
    06.07.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Ok, aber wie speicher ich den Text als iso8891 - Format?

    Was meinst du mit : "Deine console soll auch iso8891 zeigen" ?

    danke, für deine Hilfe!
     
  13. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  14. #12 gonso, 14.11.2006
    Zuletzt bearbeitet: 14.11.2006
    gonso

    gonso Grünschnabel

    Dabei seit:
    10.11.2006
    Beiträge:
    7
    Zustimmungen:
    0
    Das hängt schon von deinem Editor ab, oder ?
    Ich nutze kwrite und da kann ich encoding auswählen genauso bei console.
    ich denke aber console ist nicht so wichtig (wird nur mist zeigen), aber program wird funktionieren.
    Der fehler kommt schon bei gcc."Warnung: Zeichenkonstante mit mehreren Zeichen"
    file loc.c
    loc.c: ISO-8859 C program text
     
  15. #13 Nerthus, 14.11.2006
    Nerthus

    Nerthus Jungspund

    Dabei seit:
    06.07.2005
    Beiträge:
    16
    Zustimmungen:
    0
    Ok, jetzt klappts. Der Code abeitet wie beabsichtigt!
    Nur Buchstaben > 127 werden immer noch ned richtig dargestellt!

    locale meldet:

     
Thema:

isalpha + setlocale