UTF8 in c

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

UTF8 in c

Beitrag von mclien » 26.10.2009 15:03:22

Quäle mich hier gerade mit c (und später c++) rum:
nun soll mir folgendes Listing:
/*
*/
#include <stdio.h>

int main(void) {
int i;
for(i=0; i < 254; i++) {
if(i==27) // ESC-Zeichen ignorieren
continue;
printf(" |%d : %c| ",i,i);
}
return 0;
}
eigendlich den erweiterten iso_asscii Zeichensatz wiedergeben. Aber zu sehen bekomme ich nur die 127 ascii Zeichen.
Habe Lenny installiert mit LANG=en_UTF-8
Muss ich dem gcc noch irgendwei den ZEichensattz mitgeben?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: UTF8 in c

Beitrag von gms » 26.10.2009 16:19:06

setlocale hat dir gefehlt ( ansonsten verwendet C die "C" Locale ) und printf war auch nicht korrekt:

edit: ich wollte eigentlich noch dazu sagen, daß das sehr wenig mit utf-8 zu tun hat :wink:
( die Zahlen spiegeln die Unicode und nicht die utf-8 Kodierung wieder )

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

int main(void) {
  int i;
  setlocale(LC_ALL, "");
  for(i=0; i < 254; i++) {
    if(i==27) // ESC-Zeichen ignorieren
      continue;
    printf(" |%d : %lc| ",i,(wchar_t)i);
    if (i%4==0)
      printf("\n");
  }
  return 0;
}

Code: Alles auswählen

gms@gms1 ~ $ gcc -o x x.c && ./x
 |0 : |                         
 |1 : |  |2 : |  |3 : |  |4 : | 
 |5 : |  |6 : |  |7 : |  |8 :|  
 |9 :   |  |10 :                
|  |11 :                        
         |  |12 :               
                  |             
|  |14 : |  |15 : |  |16 : |    
 |17 : |  |18 : |  |19 : |  |20 : | 
 |21 : |  |22 : |  |23 : |  |24 : ▒| 
 |25 : |  |26 : ▒|  |28 : |          
 |29 : |  |30 : |  |31 : |  |32 :  | 
 |33 : !|  |34 : "|  |35 : #|  |36 : $| 
 |37 : %|  |38 : &|  |39 : '|  |40 : (| 
 |41 : )|  |42 : *|  |43 : +|  |44 : ,| 
 |45 : -|  |46 : .|  |47 : /|  |48 : 0| 
 |49 : 1|  |50 : 2|  |51 : 3|  |52 : 4| 
 |53 : 5|  |54 : 6|  |55 : 7|  |56 : 8| 
 |57 : 9|  |58 : :|  |59 : ;|  |60 : <| 
 |61 : =|  |62 : >|  |63 : ?|  |64 : @| 
 |65 : A|  |66 : B|  |67 : C|  |68 : D| 
 |69 : E|  |70 : F|  |71 : G|  |72 : H| 
 |73 : I|  |74 : J|  |75 : K|  |76 : L| 
 |77 : M|  |78 : N|  |79 : O|  |80 : P| 
 |81 : Q|  |82 : R|  |83 : S|  |84 : T| 
 |85 : U|  |86 : V|  |87 : W|  |88 : X| 
 |89 : Y|  |90 : Z|  |91 : [|  |92 : \| 
 |93 : ]|  |94 : ^|  |95 : _|  |96 : `| 
 |97 : a|  |98 : b|  |99 : c|  |100 : d| 
 |101 : e|  |102 : f|  |103 : g|  |104 : h| 
 |105 : i|  |106 : j|  |107 : k|  |108 : l| 
 |109 : m|  |110 : n|  |111 : o|  |112 : p|
 |113 : q|  |114 : r|  |115 : s|  |116 : t|
 |117 : u|  |118 : v|  |119 : w|  |120 : x|
 |121 : y|  |122 : z|  |123 : {|  |124 : ||
 |125 : }|  |126 : ~|  |127 : |  |128 : |
 |129 : |  |130 : |  |131 : |  |132 : |
 |133 : |  |134 : |  |135 : |  |136 : |
 |137 : |  |138 : |  |139 : |  |140 : |
 |141 : |  |142 : |  |143 : |  |144 : |
 |145 : |  |146 : |  |147 : |  |148 : |
 |149 : |  |150 : |  |151 : |  |152 : |
 |153 : |  |154 : |  |155 :   |156 : |
 |157 : |  |158 : |  |159 : |  |160 :  |
 |161 : ¡|  |162 : ¢|  |163 : £|  |164 : ¤|
 |165 : ¥|  |166 : ¦|  |167 : §|  |168 : ¨|
 |169 : ©|  |170 : ª|  |171 : «|  |172 : ¬|
 |173 : ­|  |174 : ®|  |175 : ¯|  |176 : °|
 |177 : ±|  |178 : ²|  |179 : ³|  |180 : ´|
 |181 : µ|  |182 : ¶|  |183 : ·|  |184 : ¸|
 |185 : ¹|  |186 : º|  |187 : »|  |188 : ¼|
 |189 : ½|  |190 : ¾|  |191 : ¿|  |192 : À|
 |193 : Á|  |194 : Â|  |195 : Ã|  |196 : Ä|
 |197 : Å|  |198 : Æ|  |199 : Ç|  |200 : È|
 |201 : É|  |202 : Ê|  |203 : Ë|  |204 : Ì|
 |205 : Í|  |206 : Î|  |207 : Ï|  |208 : Ð|
 |209 : Ñ|  |210 : Ò|  |211 : Ó|  |212 : Ô|
 |213 : Õ|  |214 : Ö|  |215 : ×|  |216 : Ø|
 |217 : Ù|  |218 : Ú|  |219 : Û|  |220 : Ü|
 |221 : Ý|  |222 : Þ|  |223 : ß|  |224 : à|
 |225 : á|  |226 : â|  |227 : ã|  |228 : ä|
 |229 : å|  |230 : æ|  |231 : ç|  |232 : è|
 |233 : é|  |234 : ê|  |235 : ë|  |236 : ì|
 |237 : í|  |238 : î|  |239 : ï|  |240 : ð|
 |241 : ñ|  |242 : ò|  |243 : ó|  |244 : ô|
 |245 : õ|  |246 : ö|  |247 : ÷|  |248 : ø|
 |249 : ù|  |250 : ú|  |251 : û|  |252 : ü|
 |253 : ý| gms@gms1 ~ $
Gruß
gms

mclien
Beiträge: 2468
Registriert: 06.12.2005 10:38:46
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Baustelle

Re: UTF8 in c

Beitrag von mclien » 27.10.2009 14:15:13

gms hat geschrieben:setlocale hat dir gefehlt ( ansonsten verwendet C die "C" Locale ) und printf war auch nicht korrekt:

edit: ich wollte eigentlich noch dazu sagen, daß das sehr wenig mit utf-8 zu tun hat :wink:
( die Zahlen spiegeln die Unicode und nicht die utf-8 Kodierung wieder )
:oops: Habe ich mir schon fast gedacht, leider war meine Literatur auch nicht besonders hilfreich in diesem Punkt
Kann man sich eine Umgebung einrichten, daß C das nicht noch extra gesagt werden muß?
(wird in dem Beispiel nähmlich komplett unterschlagen.

Jedenfalls vielen Dank

das

Code: Alles auswählen

printf(" |%d : %lc| ",i,(wchar_t)i);
geht bei mir auch so:

Code: Alles auswählen

printf(" |%d : %lc| ",i,i);
Wieso bzw. was spricht dagegen das wegzu lassen?

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: UTF8 in c

Beitrag von gms » 27.10.2009 17:57:39

mclien hat geschrieben: Kann man sich eine Umgebung einrichten, daß C das nicht noch extra gesagt werden muß?
(wird in dem Beispiel nähmlich komplett unterschlagen.
du meinst das "setlocale" ? Nein, daran führt kein Weg vorbei, wenn du nicht mit der "C"-Locale auskommst. ( außer du verwendest ein Toolkit/Library..., was das für dich erledigt )
mclien hat geschrieben: das

Code: Alles auswählen

printf(" |%d : %lc| ",i,(wchar_t)i);
geht bei mir auch so:

Code: Alles auswählen

printf(" |%d : %lc| ",i,i);
Wieso bzw. was spricht dagegen das wegzu lassen?
gerade bei Funktionen wie printf sollte man peinlich darauf achten, den richtigen Datentyp zu verwenden. Nicht unter jeder Architektur ist 'int' und 'wchar_t' gleich lang ( z.B unter Win32 hat 'int' eine Länge von 4 Byte und 'wchar_t' eine Länge von 2 Byte ). Der gleiche Code unter Windows kompiliert wäre daher fehlerhaft und solche Fehler sind im nachhinein oft sehr schwer zu finden.

Gruß
gms

Antworten