Здрасьте :) Вопрос, есть такая функция как fgetwc(...) которая вроде должна считывать Unicode-символ из файла, но на самом деле нифига не считывает, точнее считывает как обычный однобайтовый символ, а потом его преобразует в четырёхбайтовый. При этом нашёл у себя 2 man страницы по теме:
man 3 fgetwc
It reads a wide character from stream and returns it.
man 3p fgetwc
The fgetwc() function shall obtain the next character (if present) from the input stream pointed to by stream, convert that to the corresponding wide-character code, and advance the associated file position indicator for the stream (if defined).
И как бы получается пишут они немного о разном...
И вот например, существует файл /home/maxim/unicode16.txt закодированный в UTF-16, и программа:
// main.c
#include <stdio.h>
#include <wchar.h>
#include <string.h>
int main(void)
{
printf("Size of wchar_t = %d\n", sizeof(wchar_t)); // 4
printf("Size of wint_t = %d\n\n", sizeof(wint_t)); // 4
FILE* f_in = fopen("/home/maxim/unicode16.txt", "r");
if (!f_in) {
fprintf(stderr, "Невозможно открыть файл для чтения!\n");
return -1;
}
wint_t wc = 0;
clearerr(f_in);
printf("Status: %s\n", strerror(ferror(f_in)));
while (wc = fgetwc(f_in)) {
if (ferror(f_in)) {
fprintf(stderr, "Status: %s\n", strerror(ferror(f_in)));
break;
}
printf("%08X : `%lc'\n", wc, wc);
}
fclose(f_in);
return 0;
}
Результаты её работы:
$gcc -o main main.c && ./main
Size of wchar_t = 4
Size of wint_t = 4
Status: Success
00000001 : `'
00000004 : `'
0000000A : `
'
А вот содержимое unicode16.txt (Там записана буква Ё и перевод строки):
$hexdump -C /home/maxim/unicode16.txt
00000000 01 04 0a 00 |....|
00000004
Я ожидал что программа выдаст что-то вроде 00000104 00000A00, а выдаёт она не то. Где подвох, и как мне таки прочитать один символ _юникода_ из файла?