2011-04-10 1 views
0

J'ai toujours essayé de faire fonctionner ça. Le programme est censé prendre deux arguments, sur la taille de la mémoire tampon et un autre pour un nom de fichier et convertir ce fichier UTF-32 en UTF-8. J'ai utilisé la fonction fgetc() pour remplir un tableau int avec le codepoint Unicode. J'ai testé printint sur le contenu de mon tampon, et il a tous ces caractères nuls au lieu de chaque codepoint.Convertisseur UTF-32 en UTF-8 en C, le tampon est plein de zéros/zéros

Par exemple, pour un fichier constitué de seulement le caractère 'A': tampon [0] est égal à 0 tampon [1] est égal à 0 tampon [2] est égal à 0 tampon [3] est de 41

Les points de code pour tout ce qui précède U + 7F finissent par se séparer.

Voici le code pour initialiser mon tampon:

 int main(int argc, char** argv) { 
    if (argc != 3) { 
    printf("Must input a buffer size and a file name :D"); 
    return 0; 
    }

FILE* input = fopen(argv[2], "r"); if (!input) { printf("The file %s does not exist.", argv[1]); return 0; } else { int bufferLimit = atoi(argv[1]); int buffer[bufferLimit]; int charReplaced = 0; int fileEndReached = 0; int i = 0; int j = 0;

while(1) { // fill the buffer with the characters from the file. for(i = 0; i < bufferLimit; i++){ buffer[i] = fgetc(input); // if EOF reached, move onto next step and mark that // it has finished. if (buffer[i] == EOF) { fileEndReached = 1; break; } } // output buffer of chars until EOF or end of buffer for(j = 0; j <= i; j++) { if(buffer[j] == EOF) { break; } // check for Character Replacements charReplaced += !convert(buffer[j]); } if(fileEndReached != 0) { break; } } //return a 1 if any Character Replacements were used if(charReplaced != 0) { return 1; }

}}

Répondre

2

fgetc() retourne un octet, et non un point de code unicode. De là, sur la base de cette fausse supposition, tout s'effondre.

+1

UTF-32 utilise 4 octets par point de code. Vous devez également prendre en compte l'endian pour les encodages qui utilisent plus de 1 octet par codeunit (UTF-16, UTF-32). –