Чтение символов Юникода из файла в C - PullRequest
3 голосов
/ 02 марта 2012

Мне нужно прочитать символы Unicode из файла.Единственное, что мне нужно от них сделать, это извлечь их номер Unicode.Я работаю в Windows XP, используя CodeBlock Mingw.

Я делаю что-то вроде этого

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

Я получаю результат как 255 все время.

testunicode.txtхранится в Encoding = Unicode (создается с помощью блокнота)

Последняя задача - прочитать файл, который может содержать символы любого языка, но wchar_t имеет размер только 2 байта, поэтому он сможет получить Unicode для всех возможныхсимволы языков?

Нужна ваша помощь ...



Спасибо всем за ваш ответ.

Теперь я изменил код.

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

Он печатает правильный код UTF 16.Проект, в котором он будет использоваться, требует чтения символов с разных языков мира.Так будет ли UTF-16 суффиксом или мы должны изменить кодировку хранимых файлов на UTF-32?Кроме того, здесь wchar_t составляет 2 байта, для UTF-32 нам нужен некоторый тип данных с 4 байтами.Как это сделать?

Еще раз спасибо за ваш ответ ........

1 Ответ

4 голосов
/ 02 марта 2012

Хорошо, код в вашем вопросе читает только первый символ вашего файла, поэтому вам придется реализовать некоторую циклическую конструкцию для обработки всего содержимого этого файла.

Теперь fgetwc () возвращает 255 (0xFF) по трем причинам:

  • Вы не учитываете метку порядка байтов файла, поэтому в конечном итоге вы читаете его вместо фактического содержимого файла,

  • Вы не указываете флаг режима перевода в аргументе mode для _wfopen () , поэтому по умолчанию он равен text и fgetwc() соответственно пытается прочитать многобайтовый символ вместо широкого символа

  • 0xFF (первый байт little-endian UTF-16 BOM ), вероятно, не является ведущим байтом в текущей кодовой странице вашей программы, поэтому fgetwc() возвращает без дальнейшей обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...