isalpha + setlocale

N

Nerthus

Jungspund
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:

C
de_AT.utf8
de_BE.utf8
de_CH.utf8
de_DE
de_DE@euro
de_DE.iso88591
de_DE.iso885915@euro
de_DE.utf8
de_LU.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
POSIX

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
 
Code:
#include <stdio.h>
#include <ctype.h>
#include <locale.h>

int main()
{
	setlocale(LC_CTYPE,"de_DE");
	if(isalpha('Ä'))
		printf("%c\n",'Ä');
	return 0;
}
 
Unter OpenSuSE 10.2 (Beta) klappt das, unter FreeBSD 6.1 nicht ... auch wenn man statt "de_DE" einen installierten locale-String verwendet.

Heiko
 
@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!?!
 
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;
}
gcc -o bla loc.c -Wall
sh-3.2$ ./bla
Ä
! " # $ % & ' ( ) * + , - . /
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 { | } ~
¡ ¢ £ ¤ ¥ ¦ §
¨ © ª « ¬ * ® ¯ ° ± ² ³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿
À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö ×
Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å æ ç è é ê ë ì í î ï
ð ñ ò ó ô õ ö ÷ ø ù ú û ü ý þ ÿ
Dann muss was an deinem system faul sein.
ps.
gcc --version
gcc (GCC) 4.1.1 (Gentoo 4.1.1-r1)
 
Und was?
Irgendeine Idee?

bye

Ps: Hab gcc2.95, gcc3.4.5 und gcc4.0 versucht. Immer mit selben Ergebnis!
 
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$
 
Jo, speicher es als iso8891ab .
Deine console soll auch iso8891 zeigen.
Keine Ahnung was $LANG zeigen muss, ob auch "de_DE" .
 
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!
 
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
 
Zuletzt bearbeitet:
Ok, jetzt klappts. Der Code abeitet wie beabsichtigt!
Nur Buchstaben > 127 werden immer noch ned richtig dargestellt!

locale meldet:

nerthus@ubuntu:~/coding/c/test$ locale
LANG=de_DE.iso88591
LC_CTYPE="de_DE.iso88591"
LC_NUMERIC="de_DE.iso88591"
LC_TIME="de_DE.iso88591"
LC_COLLATE="de_DE.iso88591"
LC_MONETARY="de_DE.iso88591"
LC_MESSAGES="de_DE.iso88591"
LC_PAPER="de_DE.iso88591"
LC_NAME="de_DE.iso88591"
LC_ADDRESS="de_DE.iso88591"
LC_TELEPHONE="de_DE.iso88591"
LC_MEASUREMENT="de_DE.iso88591"
LC_IDENTIFICATION="de_DE.iso88591"
LC_ALL=
 

Ähnliche Themen

Gnome3 Regionseinstellung deutsch

Keine Sonderzeichen im Terminal

Keine umlaute werden angezeigt in der Konsole

perl: warning: Setting locale failed.

SLES10: Locale-Settings Problem

Zurück
Oben