16. januar 2012 - 15:24Der er
19 kommentarer og 1 løsning
char der fylder 2 eller 4 byte?
Har brug for en stump kode der viser mig hvordan jeg får en char til at fylde 2 eller 4 byte i C. Det skal være sådan at når den indgår i et char * at den så selv ved at de næste 2 byte faktisk er en enkelt karakter således at jeg kan benytte f.eks. bindestregen i – dog uden speciel tegnene rundt omkring. Jeg ved godt at der er pendanter til mange af disse chars men da det skal bruges til et program der skal overtage for et andet program er det et krav at chars netop kan tage disse høje værdier.
så hvis jeg har en metode, som er begravet meget dybt i applikationen, er det muligt at behandle det som wchar_t for at konventere det igen og blot skrive det ud igen eller hvor meget vil der gå tabt på det?
så jeg kan skifte et default charset på applikations niveau som tillader mig at arbejde med den nuværende kode som den er, eller skal jeg stadigvæk skifte til wchar_t?
Har fundet frem til det problem der tildels har ført til det der er beskrevet ovenfor. Filen er bliver læst fra er ISO-8859-1 men det jeg får med fgets har jeg en mistanke om at der er UTF-8 da det ihvertfald IKKE er ISO-8859-1.
Så vidt jeg har kunnet læse mig til er det fgets() der lever sit eget liv og insistere på UTF-8, ved dog ikke om dette er korrekt eller om det kan ændres på nogen måde?
Først og fremmest Arne_V smider du et svar så du kan få point?
Så til de to små opfølger problemer:
1. variablen index synes jeg ikke tæller op som forventet. Det er højest sandsynligt pga det er konventeering fra UTF-8 til ISO-8859-1 da nogle karaktere oversættes fint f.eks. 'ø' som fylder 2 byte, men i den nye streng skal det jo fylde 1 byte og det klare den fint men det fucker jo noget så eftertrkkeligt med det index hvor jeg skal placere mine erstatnings værdier for de karaktere der enten har været oversat forkert i fortiden, eller som den ikke gider oversætte korrekt nu :-)
1. Jeg har problemer med at ændre en værdi i et 'char *'. Dette virker suspekt da jeg sagtens kan ændre bufferen til at gøre hvad jeg ønsker efter at while-løkken terminere så er sku nok mig der er dum og blind. (det er outpos[index] = (char) 216 der ignoreres)
[code] int index = 0; while (inleft > 0) { if (iconv(conv, &inpos, &inleft, &outpos, &outleft) == (size_t)-1) { if (errno == E2BIG) { /* Output buffer is filled */ char *newbuffer; if ((newbuffer = (char *)realloc(buffer, size + 128 + 1)) == NULL) { /* If we could not allocate ekstra space, the old buffer is not freed and can thus be used */ break; } else { buffer = newbuffer; outpos = &buffer[size-outleft]; size+=128; outleft+=128; } } else if (errno == EINVAL) { /* We got an invalid character */ inpos++; inleft--; } else { if(strcasecmp(from, "utf-8") == 0 && inpos[0] == -53 && inpos[1] == -100) { index = (unsigned int)(strlen(buffer)); outpos[index] = (char)216; printf("index %d\n", index);
Opdatering. Kiggede på bytes og alt det skidt og lader til at UTF-8 værdien(sammen sat, da det er i 8bit format) ikke er en UTF-8 værdi men en Windows-something encoding... passer med alle de problemer jeg har haft med specifikke karaktere(hvem sagde mails med forkert encoding angivelse? :-S) Oh well.. suckie suckie men jeg vil stadigæk gerne have nogle svar på de to spørgsmål alligevel :-)
Hehe.. det problem er løst :-) så mangler bare et svar fra dig så du kan få point... men havde du en ide om det emne som jeg skrev til dig angående Base64 Decoder løsningen du havde postet i et andet spørgsmål her inde? har skrevet en privat besked til dig med den :-)
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.