windows - læsning af unicode-tegn fra filen i C

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal læse Unicode-tegn fra en fil. Det eneste, jeg skal gøre af dem, er at udtrække deres Unicode-nummer. Jeg kører på Windows XP ved hjælp af CodeBlock Mingw.


Jeg laver noget som dette


#define UNICODE
#ifdef UNICODE
#define \_UNICODE
#else
#define \_MBCS
#endif

    #include <stdio.h>
    #include <stdlib.h>
    #include <wchar.h>
    int main()
    {
        wchar\_t *filename=L"testunicode.txt";
        FILE *infile;
        infile=\_wfopen(filename,L"r");
        wchar\_t result=fgetwc(infile);
        wprintf(L"\%d",result);//To verify the unicode of character stored in file,print it   
        return 0;
    }


Jeg får resultatet som 255 hele tiden.


testunicode.txt er gemt i Encoding=Unicode (oprettet via notesblok)


Den endelige opgave er at læse fra en fil, der kan indeholde tegn fra ethvert sprog, men wchar\_t er kun 2 byte, så vil det være muligt at få unicode til alle mulige sprogtyper?


Har brug for din hjælp...








Tak til alle for dit svar.


Nu har jeg ændret koden.


#define UNICODE
#ifdef UNICODE
#define \_UNICODE
#else
#define \_MBCS
#endif

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main()
{
    wchar\_t *filename=L"testunicode.txt";
    FILE *infile;
    infile=\_wfopen(filename,L"r");
    wchar\_t  b[2];
    fread(b,2,2,infile);//Read a character from the file
    wprintf(L"\%d",b[1]);
    return 0;
}


Den udskriver korrekt UTF 16 kode. Projektet, hvor det bliver brugt, skal læses fra forskellige sprog i verden. Så vil UTF-16 blive suffiks, eller skal vi ændre kodning af lagrede filer til UTF-32? Også her er wchar\_t 2 bytes, for UTF-32 har vi brug for en datatype med 4 bytes. Hvordan opnår man det?


Tak igen for dit svar ........

Bedste reference


Koden i dit spørgsmål læser kun din første tegn, så du bliver nødt til at implementere en slags loopingkonstruktion for at behandle hele indholdet af den pågældende fil.


Nu vender fgetwc () tilbage 255 (0xFF) af tre grunde: [10]



  • Du tager ikke hensyn til filens byte-ordre, så du ender med at læse den i stedet for den faktiske filindhold, [11]

  • Du angiver ikke et oversættelsesmodus flag i argumentet mode til \_wfopen (), så det er standard til text og fgetwc() prøver derfor at læse et multibytegn i stedet for en bred karakter, [12]

  • 0xFF (den første byte af en lille endian UTF-16 BOM) er sandsynligvis ikke en ledende byte på dit programs nuværende kode side, så fgetwc() returnerer det uden videre behandling. [13] [14]