ubuntuusers.de

strcasecmp in c mit utf-8

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Hallo

Helft mir bitte mal auf die Sprünge. strcasecmp kann ja wohl nur ascii. ich hab mal was über multibyte string lib in c gelesen, hab aber irgendwie die namen/bookmarks verbummelt.

danke

cu

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Diese Funktion ist aber doch kein ANSI C, oder irre ich mich? Kommt mir jedenfalls nicht bekannt vor und in meinem O'Reilly kurz & gut steht die auch nicht drin. Woher stammt die denn bei Dir?

microft

(Themenstarter)
Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Lysander schrieb:

Diese Funktion ist aber doch kein ANSI C, oder irre ich mich? Kommt mir jedenfalls nicht bekannt vor und in meinem O'Reilly kurz & gut steht die auch nicht drin. Woher stammt die denn bei Dir?

man strcasecmp

hieß früher mal stricmp

Ob das ansi is weiß ich nicht, ist aber seit 100 Jahren in der c lib.

cu

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

microft schrieb:

man strcasecmp

Dann kontere ich mal: man wcscasecmp

microft

(Themenstarter)
Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Lysander schrieb:

microft schrieb:

man strcasecmp

Dann kontere ich mal: man wcscasecmp

Guter Konter;-)

Aber so richtig kompatibel ist er nicht. Erstmal meckert der Compiler wegen falsche Pointer und außerdem gehts so nicht. Ich hab hier offensichtlich das Problem wie die Parameter aussehen müßen, ordinäre strings sind es jedenfalls nicht.

Hab übrigens mittlerweiler ne toupper Funktion im Netz gefunden die funzt.

cu

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
static char *stoupper(const char *s)
   {
   char *p = NULL, *oldp;
   size_t len;
   wchar_t wc;
   int wclen, mclen;

   if ( s ) 
      {
      len = strlen(s) ;
      oldp = p = malloc(len + MB_CUR_MAX + 1) ;
      if ( p ) 
         {
         while ((wclen = mbtowc(&wc, s, len)) > 0) 
            {
            /* I know, too many casts, but makes -Wconversion flag happy */
            mclen = wctomb(p, (wchar_t)towupper((wint_t)wc));
            /* Strange ... but I always trust Ben */
            if ( mclen > wclen ) 
               {
               len += (size_t)(mclen - wclen) ;
               mclen = (int)(p - oldp) ;
               /* realloc it's a pain, but what else can I do? */
               p = realloc(oldp,len) ;
               if ( !p ) { free(oldp) ; return NULL ; }
               oldp = p ;
               }
            p += mclen;
            s += wclen;
            }
         *p = '\0';
         p -= len;
         }
      }
   return p;
   }



Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

Zum Umgang mit UTF-8 in C ist es empfehlenswert, Drittbibliotheken wie z.B. ICU oder GLib zu verwenden. Insbesondere letztere Bibliothek ist bei der C Programmierung sowieso allgemein empfehlenswert und kann schon fast als "zweite Standardbibliothek" betrachtet werden.

Ganz allgemein ist der Verzicht auf C ebenfalls empfehlenswert.

Antworten |