1

2 つの問題があります。1) このコードをテストすると、buf の前に余分な文字がいくつか表示されます。(ファイルが空の場合、何らかの理由で fsize が 3 に設定されます)。

2) ファイルに utf-8 文字が含まれており、コンソールに正しく表示されません。ロケールを LC_ALL に設定しようとしましたが、効果がないようです。

void display_title(void)
{
    FILE *fh;
    char *buf;
    long fsize;

    fh = fopen("title.txt", "r");
    if (fh == NULL)
    {
        fprintf(stderr, "Unable to open title.txt for read\n");
        return;
    }

    fseek(fh, 0L, SEEK_END);
    fsize = ftell(fh);
    rewind(fh);
    buf = malloc(sizeof(char)*fsize);

    fread(buf, fsize, 1, fh);
    fclose(fh);

    fwrite(buf, fsize, 1, stdout);
    free(buf);
}

編集:だから私はファイルのエンコーディングをチェックする関数を書きましたが、まだ何かがおかしいです。ファイルを確認したところ、UTF_8 であることがわかりましたが、関数に登録されていません。どこかにバグがある気がしますが、見当たりません。

// Check for BOM in file
// ERROR : file too small
// NONE : does not exist
// UTF_8_ENCODING : for utf_8 enoding found
// UTF_16_ENCODING : for utf_16 encoding found
// UTF_32_ENCODING : for utf_32 encoding found
int check_encoding(int fd)
{
    char *buf;
    off_t fsize;

    fsize = lseek(fd, 0L, SEEK_END);

    if (fsize < 2)
        return ERROR;

    buf = (char*)malloc(2 * sizeof(char));
    lseek(fd, 0L, SEEK_SET);
    read(fd, buf, 2);

    if (!strncmp(buf, UTF_16_BE, 2) ||
        !strncmp(buf, UTF_16_LE, 2))
    {
        free(buf);
        return UTF_16_ENCODING;
    }

    if (fsize >= 3)
    {
        realloc(buf, 3);

        if (!strncmp(buf, UTF_8, 3))
        {
            free(buf);
            return UTF_8_ENCODING;
        }
    }

    if (fsize >= 4)
     {
        realloc(buf, 4);

        if (!strncmp(buf, UTF_32_BE, 4) ||
            !strncmp(buf, UTF_32_LE, 4))
        {
            free(buf);
            return UTF_32_ENCODING;
        }
    }

    free(buf);
    return FALSE;
}
4

1 に答える 1