Oprettet man. d. 16. januar 2012 kl. 15:24:25

thums
thums (20.487 point. Point ude: 60)

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.

Skrevet man. d. 16. januar 2012 kl. 15:28:24| #1

arne_v
arne_v (1.016.169 point)
Er der wchar_t du leder efter?

(det er wide chars som er 16 bit paa de gaengse platforme)

Skrevet man. d. 16. januar 2012 kl. 20:12:13| #2

bertelbrander
bertelbrander (17.270 point)
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.

Skrevet man. d. 16. januar 2012 kl. 20:57:40| #3

thums
thums (20.487 point)
kan de bruges sammen med et normalt char * eller skal der laves  et wchar_t hvis det overhovedet fungere på samme måde?

Skrevet man. d. 16. januar 2012 kl. 21:02:06| #4

arne_v
arne_v (1.016.169 point)
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.

Skrevet man. d. 16. januar 2012 kl. 21:07:33| #5

thums
thums (20.487 point)
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?

Skrevet man. d. 16. januar 2012 kl. 21:18:04| #6

arne_v
arne_v (1.016.169 point)
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?

Skrevet man. d. 16. januar 2012 kl. 21:29:13| #7

thums
thums (20.487 point)
problemet vedbliver jo da jeg skal bruge de 2 bytes for at kunne sammneligne med den gamle data

Skrevet man. d. 16. januar 2012 kl. 21:31:01| #8

arne_v
arne_v (1.016.169 point)
&#8211 kan godt repraesenteres i UTF-8.

Skrevet man. d. 16. januar 2012 kl. 21:39:19| #9

thums
thums (20.487 point)
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?

Skrevet man. d. 16. januar 2012 kl. 22:49:53| #10

arne_v
arne_v (1.016.169 point)
UTF-8 boer virke med normal char.

Skrevet tir. d. 17. januar 2012 kl. 08:08:42| #11

thums
thums (20.487 point)
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?

Skrevet tir. d. 17. januar 2012 kl. 09:05:54| #12

segmose
segmose (27.030 point)
Der findes funktioner der konverterer mellem de forskellige formater.

Skrevet ons. d. 18. januar 2012 kl. 10:33:53| #13

thums
thums (20.487 point)
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?

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;

Skrevet ons. d. 18. januar 2012 kl. 10:40:22| #14

thums
thums (20.487 point)
brugte en metode til at conventere det tilbage og det ser ud til at virke så den sidste kommentar er løst

Skrevet tor. d. 19. januar 2012 kl. 04:07:09| #15

arne_v
arne_v (1.016.169 point)
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.

Skrevet tir. d. 24. januar 2012 kl. 15:49:46| #16

thums
thums (20.487 point)
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)


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--;
            }
        }
    }
}

Skrevet tir. d. 24. januar 2012 kl. 21:59:58| #17

thums
thums (20.487 point)
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 :-)

Skrevet lør. d. 28. januar 2012 kl. 23:59:24| #18

arne_v
arne_v (1.016.169 point)
Jeg kan slet ikke gennemskue den kode.

Er problemnet at du skal konvertere fra UTF-8 til ISO-8859-1?

Skrevet man. d. 30. januar 2012 kl. 20:02:10| #19

thums
thums (20.487 point)
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 :-)

Skrevet man. d. 30. januar 2012 kl. 20:08:35| #20


Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Updater Hybrid App

Oprettet den 18. april 2012 kl. 13.29
sir_madsen giver 100 point for svar | Giv et svar »

Ansi-c win32API - kan ikke oprette Richedit4.1 kontrol

Oprettet den 16. april 2012 kl. 22.13
cblcbl giver 60 point for svar | Giv et svar »

Iphone Objective C - Sætte image på et imageview.

Oprettet den 7. april 2012 kl. 11.36
lasserasch giver 30 point for svar | Giv et svar »



   




Tips & Tricks fra PC World

Teaser billede

Læserne: Her er vores værste it-indkøb

Det er ikke al it-udstyr, som er det rene guld. Her er nogle af læsernes skrækhistorier.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan siger du farvel til Facebook

Læs her, hvordan du dropper Facebook og i stedet anvender nogle brugervenlige alternativer, så du stadig kan være social på nettet.


Nyheder fra Computerworld

Teaser billede

Galleri: De fedeste håndholdte gennem 40 år

Her har du de mest banebrydende håndholdte computere gennem alle tider.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger