c - ANSI C : isprint() returns true for non-ASCII character?

标签 c unicode ascii non-ascii-characters ansi-c

我有一些 C 代码可以打印文件的全部内容。该程序之前可以很好地打印一个文件,但是当它打印一秒钟时,我总是看到一个绝对不应该出现的 Unicode 字符。

int c = fgetc(file);
putchar((!isprint(c) ? : c));

(包裹在 while(!feof(file)))
应该只打印 ASCII 可打印字符,除非我弄错了。无论如何,它首先打印的是 \357\277\275,它不是 ASCII,也不可打印。

该文件仅包含:foo+bar.foo+t-bar.foo+completely fake

它打印出:�foo+bar.foo+t-bar.foo+completely fake(在奇怪的字符和其他字符之间有一个换行符)。

简单地打印所有内容(a la putchar(c))将完全相同的字符放在行尾。

我什至尝试过使用另一个文件(通过重命名旧文件并使用指向另一个文件的软链接(soft link)),但我得到了完全相同的结果。

如果文件为空,它也会这样做。

文件完全是纯文本,用vim创建,没有什么特别之处。

原始代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

int main(void)
{
    char *headp = "../include/header";
    char *listp = "../.piclist";
    FILE *head, *list;

    puts("Content-Type: text/html; charset=utf-8\nExpires: 0\n");

    puts("<!DOCTYPE html>\n<html lang='en'>\n<head>");
    puts("\t<title>Foo</title>");
    puts("\t<link rel='stylesheet' href='/css/main.css' />");
    puts("\t<link rel='stylesheet' href='/css/foo.css' />");
    puts("</head>\n<body>");

    head = fopen(headp, "r");
    if (errno) {
            perror("cannot open include/header");
            errno = 0;
    } else {
            while (!feof(head)) putchar(fgetc(head));
            putchar('\n');
    fclose(head);
    }

    list = fopen(listp, "r");
    if (errno) perror("cannot open .piclist");
    else {
    while (!feof(list)) {
            while (!feof(list)) {
                    int c = fgetc(list);
                    putchar((!isprint(c) ? : c));
            }
    }
    fclose(list);
    } /* else */

    fputs("\n<footer>\n\t<hr />\n\t<p>Copyright 2011-2012 the ", stdout);
    fputs("<a href='mailto:foo@example.com'> ", stdout);
    fputs("Foo Bar of Baz</a> of ", stdout);
    fputs("<a href='http://blah.org'>Blah United ", stdout);
    fputs("</a></p>\n</footer>\n</body>\n</html>\n",stdout);

    return 0;
}

最佳答案

不要使用 feof()(至少不是你使用它的方式)

此外,您对 errno 的使用是错误的。 errno 包含在某些操作指示错误返回后可用的值(主要以NULL,或-1作为返回值)

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>

int main(void)
{
    char *headp = "../include/header";
    char *listp = "../.piclist";
    FILE *head, *list;
    int ch;

    puts("Content-Type: text/html; charset=utf-8\nExpires: 0\n");

    puts("<!DOCTYPE html>\n<html lang='en'>\n<head>");
    puts("\t<title>Warrenton Latin School | Gallery</title>");
    puts("\t<link rel='stylesheet' href='/css/main.css' />");
    puts("\t<link rel='stylesheet' href='/css/gallery.css' />");
    puts("</head>\n<body>");

    head = fopen(headp, "r");
    if (!head) {
            perror("cannot open include/header");
            errno = 0;
    } else {
        while (1) {
            ch = fgetc(head);
            if (ch == EOF) break;
            putchar(ch);
            }
        putchar('\n');
        fclose(head);
    }

    list = fopen(listp, "r");
    if (!list) perror("cannot open .piclist");
    else while (1) {
        ch = fgetc(list);
        if (ch == EOF) break;
        putchar((!isprint(c) ? : c));
    }
    fclose(list);

    fputs("\n<footer>\n\t<hr />\n\t<p>Copyright 2011-2012 the ", stdout);
    fputs("<a href='mailto:warrentonlatinschool@gmail.com'> ", stdout);
    fputs("Warrenton Latin School</a> co-op of ", stdout);
    fputs("<a href='http://warrentonumc.org'>Warrenton United ", stdout);
    fputs("Methodist Church</a></p>\n</footer>\n</body>\n</html>\n",stdout);

    return 0;
}

关于c - ANSI C : isprint() returns true for non-ASCII character?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9007196/

相关文章:

C - 简单斐波那契程序中的共享内存

c - 与控制台输出相同内容相比,为什么我的 C 程序的文件输出缺少最后几行?

c - 多线程服务器如何工作?

java - 处理 unicode �,如何摆脱?安卓/java

python - Unicode解码错误: 'ascii' codec can't decode byte 0x87 in position 10: ordinal not in range(128)

Python:从字符串中删除特定字符 (u"\u2610")

c++ - 使用它们的 ascii 值将 char 数组中的多个 ascii 字符转换为单个 int --- c/c++

python - 读取大型机 EBCDIC 文件

c - 在 C 中处理 ASCII 字母

c - 指向 union 成员的指针