Преобразователь UTF-32 в UTF-8 в C, буфер заполнен нулями / нулями

Я всегда пытался заставить это работать. Предполагается, что программа принимает два аргумента: один для размера буфера, а другой для имени файла и преобразует этот файл из формы UTF-32 в UTF-8. Я использовал функцию fgetc() для заполнения массива int кодовой точкой Unicode. Я протестировал вывод содержимого моего буфера, и в нем есть все эти нулевые символы вместо каждой кодовой точки.

Например, для файла, состоящего только из символа «A»: буфер [0] равен 0 буфер [1] равен 0 буфер [2] равен 0 буфер [3] равен 41

Кодовые точки для всего, что выше U + 7F, в конечном итоге разделяются.

Вот код для инициализации моего буфера:

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

person upswimsdn    schedule 10.04.2011    source источник


Ответы (1)


fgetc() возвращает байт, а не кодовую точку юникода.

Отсюда, на основе этого ложного предположения, все рушится.

person Joshua    schedule 10.04.2011
comment
UTF-32 использует 4 байта на кодовую точку. Вы также должны учитывать endian для кодировок, которые используют более 1 байта на кодовую единицу (UTF-16, UTF-32). - person Remy Lebeau; 12.04.2011