Avatar billede thums Praktikant
16. januar 2012 - 15:24 Der 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.
Avatar billede arne_v Ekspert
16. januar 2012 - 15:28 #1
Er der wchar_t du leder efter?

(det er wide chars som er 16 bit paa de gaengse platforme)
Avatar billede bertelbrander Praktikant
16. januar 2012 - 20:12 #2
C og C++ har ikke "bytes", en char er den mindste størrelse, så den har pr definition størrelsen 1.

Men ellers har Arne ret.
Avatar billede thums Praktikant
16. januar 2012 - 20:57 #3
kan de bruges sammen med et normalt char * eller skal der laves  et wchar_t hvis det overhovedet fungere på samme måde?
Avatar billede arne_v Ekspert
16. januar 2012 - 21:02 #4
Du bruger wchar_t array og pointere.

De kan ikke umiddlbart mixed med char array og pointere, men der er forskellige konverterings muligheder mellem dem.
Avatar billede thums Praktikant
16. januar 2012 - 21:07 #5
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?
Avatar billede arne_v Ekspert
16. januar 2012 - 21:18 #6
Du kan godt caste dit char* til wchar_t*, men det vil formentligt gaa galt.

For bogstaver som er i ISO-8859-1 vil hver anden byte vaere 0. Og det vil blive opfattet som end of string af normal char* processende kode.

Hvad med at bruge en variabel byte encoding som f.eks. UTF-8?
Avatar billede thums Praktikant
16. januar 2012 - 21:29 #7
problemet vedbliver jo da jeg skal bruge de 2 bytes for at kunne sammneligne med den gamle data
Avatar billede arne_v Ekspert
16. januar 2012 - 21:31 #8
&#8211 kan godt repraesenteres i UTF-8.
Avatar billede thums Praktikant
16. januar 2012 - 21:39 #9
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?
Avatar billede arne_v Ekspert
16. januar 2012 - 22:49 #10
UTF-8 boer virke med normal char.
Avatar billede thums Praktikant
17. januar 2012 - 08:08 #11
Hvordan skifter jeg så til UTF-8 for at teste? er det på OS niveau eller er der noget kode jeg kan sætte ind for at tvinge applikationen over i det?
Avatar billede segmose Nybegynder
17. januar 2012 - 09:05 #12
Der findes funktioner der konverterer mellem de forskellige formater.
Avatar billede thums Praktikant
18. januar 2012 - 10:33 #13
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?

[code]FILE *fin, *fout;
                    char *buffer = NULL;
                    size_t bufferlen = 0;
                    char line[1024];
                    write(fd[1], part->body, part->size);
                    close(fd[1]);

                    if ((fin = fdopen(fd[0], "r")) == NULL) {
                        add_fatal(__FILE__, __LINE__, "Error opening pipe: %m");
                        close(fd[0]);
                        goto generic;
                    }
                    if ((fout = open_memstream(&buffer, &bufferlen)) == NULL) {
                        add_fatal(__FILE__, __LINE__, "Error creating memory stream: %m");
                        fclose(fin);
                        close(fd[0]);
                        goto generic;
                    }
                    while (fgets(line, sizeof(line), fin) != NULL) {
                        puts(line);
                        if (strncasecmp(line, "<?xml", 5))
                            fputs(line, fout);
                    }
                    fclose(fout);
                    fclose(fin);

                    close(fd[0]);
                    return buffer;[/code]
Avatar billede thums Praktikant
18. januar 2012 - 10:40 #14
brugte en metode til at conventere det tilbage og det ser ud til at virke så den sidste kommentar er løst
Avatar billede arne_v Ekspert
19. januar 2012 - 04:07 #15
Hverken stdio.h eller string.h funktionerne bekymrer sig om ISO-8859-1 versus UTF-8.

De laeser og skriver chars.

Hvilken betydning de chars har ligger paa et hoejere niveau.

Der findes platform specifikke funktioner til at konvertere mellem et char[] med ISO-8859-1 og et char[] med UTF-8.

Og ellers er det ikke svaert at kode selv.
Avatar billede thums Praktikant
24. januar 2012 - 15:49 #16
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);

                inpos+=2;
                inleft-=2;
            } else {
                inpos++;
                inleft--;
            }
        }
    }
}
[/code]
Avatar billede thums Praktikant
24. januar 2012 - 21:59 #17
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 :-)
Avatar billede arne_v Ekspert
28. januar 2012 - 23:59 #18
Jeg kan slet ikke gennemskue den kode.

Er problemnet at du skal konvertere fra UTF-8 til ISO-8859-1?
Avatar billede thums Praktikant
30. januar 2012 - 20:02 #19
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 :-)
Avatar billede arne_v Ekspert
30. januar 2012 - 20:08 #20
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester