다음 C 코드는 stdin
에서 fgetws()
을 사용하여 행을 읽고 stdout
에 씁니다.fgetws() 및 UTF-8을 사용하는 EILSEQ
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#define STR_LEN 128
int main(int argc, char **argv)
{
FILE *infile = stdin, *outfile = stdout;
wchar_t str[STR_LEN];
if (setlocale(LC_ALL, "en.UTF-8") == NULL) {
fprintf(stderr, "Cannot set locale\n");
return 1;
}
for (;;) {
if (!fgetws(str, STR_LEN, infile)) {
if (feof(infile)) {
break;
}
perror("fgetws()");
continue;
}
str[wcscspn(str, L"\r\n")] = L'\0';
if (fwprintf(outfile, L"%ls\n", str) < 0) {
perror("fwprintf()");
}
}
return 0;
}
그것은 항상 ASCII 파일을 완벽하게 작동하지만, UTF-8 데이터를 읽을 때 가끔 fgetws()
에서 EILSEQ
오류 (잘못된 바이트 시퀀스)를 얻을, 나는 그 이유를 알아낼 수 없습니다.
출력 파일에서 오류를 일으키는 줄이 잘린 다음 일부 문자가 누락되고 나머지 부분은 다음 줄에 있습니다. 이상한 점은 내가 그 줄만 주면 아무런 오류가 없다는 것입니다.
예를 들어, 몇 줄의 UTF-8 라인 만 읽으면 괜찮습니다. 같은 줄을 여러 번 반복하면 EILSEQ
이 나옵니다.
나는 파일이 정확하게 인코딩되었음을 확신한다.
나는 musl-libc와 함께 Linux를 사용합니다.
내 코드에 무슨 문제가 있습니까?
편집 : 내가 입력 크기에 따라 몇 EILSEQ
오류가 발생할 수 있지만 두 beetween 정확한 관계를 알 수 없습니다.
동일한 입력을 사용하면 같은 줄에서 동일한 오류가 발생합니다.
오류를 유발하는 특정 오프셋 또는 문자가 아닌 것 같지만 잘못된 것일 수 있습니다.
편집 2 : 나는이 코드를 OpenBSD에서도 테스트했으며 작동한다. 이 시점에서 저는이 문제가 Linux 나 musl-libc와 관련이 있다고 생각합니다.
'STR = 0;'수 있습니다 더 좋은 방법. – wildplasser
확실합니다. 고맙습니다. –
파일의 같은 지점에서 항상 실패합니까? EILSEQ 하나 또는 두 개의 오류가 있습니까? 그 문자에 대한 utf-8 코드와 오류를 유발하는 문자의 정확한 바이트 오프셋은 무엇입니까? – rici