如果文件中有重音字符,如“á”,如何从C中读取?

如果文件中有重音字符,如“á”,如何从C中读取?,c,string,character-encoding,extended-ascii,C,String,Character Encoding,Extended Ascii,另一天,C中的字符串出现了另一个问题。假设我有一个名为fileR.txt的文本文件,我想打印它的内容。文件如下所示: Letter á Letter b Letter c Letter ê 我想阅读它并将其显示在屏幕上,因此我尝试了以下代码: #include <stdlib.h> #include <locale.h> #include <clocale> #include <stdio.h> #include <conio.h>

另一天,C中的字符串出现了另一个问题。假设我有一个名为fileR.txt的文本文件,我想打印它的内容。文件如下所示:

Letter á
Letter b
Letter c
Letter ê
我想阅读它并将其显示在屏幕上,因此我尝试了以下代码:

#include <stdlib.h>
#include <locale.h>
#include <clocale>
#include <stdio.h>
#include <conio.h>
#include <wchar.h>

int main()
{
    FILE *pF;
    char line[512]; // Current line

    setlocale(LC_ALL, "");
    pF = fopen("Aulas\\source\\fileR.txt", "r");

    while (!feof(pF))
    {
        fgets(line, 512, pF);
        fputs(line, stdout);
    }

    return 0;
}
然后,我尝试使用wchar\t来执行此操作:

#include <stdlib.h>
#include <locale.h>
#include <clocale>
#include <stdio.h>
#include <conio.h>
#include <wchar.h>

int main()
{
    FILE *pF;
    wchar_t line[512]; // Current line

    setlocale(LC_ALL, "");
    pF = fopen("Aulas\\source\\fileR.txt", "r");

    while (!feof(pF))
    {
        fgetws(line, 512, pF);
        fputws(line, stdout);
    }

    return 0;
}
我见过有人建议使用无符号字符数组,但这只会导致一个错误,因为为输入和输出生成的stdio函数采用有符号字符数组,即使我编写自己的函数来打印无符号字符数组,我也不知道如何从文件中读取无符号字符


那么,如何在C语言中读取和打印带有重音字符的文件呢?

您遇到的问题不在代码中,而是在您的期望中。文本字符实际上只是一个与某种形式的字形符号关联的值。有不同的方案来建立这种关联,通常称为编码。一种早期的、仍然很常见的编码称为美国信息交换标准代码。顾名思义,它是以美国英语为中心的。最初这是一个7位编码128个值,但后来扩展到包括使用8位的其他符号。为其他语言开发了其他编码。这不是最优的。本标准旨在解决这一问题。这是一个相对复杂的标准,旨在包含任何可能需要编码的符号。Unicode有各种不同的方案,可以权衡数据大小和字符大小,例如UTF7、UTF16和UTF32。因此,字节和字符之间不一定存在一对一的关系

所以不同的字符表示有不同的值,这些值可以大于一个字节。下一个问题是,要显示关联的图示符,您需要有一个系统,该系统能够正确地将值映射到图示符,并且能够显示所述图示符。默认情况下,许多终端应用程序不支持Unicode。它们使用ASCII或扩展ASCII。看起来这就是你可能正在使用的。终端假设它需要显示的每个字节对应一个字符,正如前面讨论的,在Unicode中不一定是这样


要尝试的一件事是将输出重定向到一个文件,并使用支持Unicode的编辑器(如notepad++)来查看文件,例如使用UTF8编码。您还可以十六进制转储输入文件以查看其编码方式。有时,Unicode文件是用字节顺序标记编写的,以帮助识别Unicode编码和字节顺序。

顺便说一句,您可以使用while!feofpF是。这不是C的问题,这是终端设置的问题。除非文件有两个字节字符,否则这两个问题都存在。要读取文本文件,您需要知道写入时的编码。要将字符写入终端,需要设置输出的编码。在cmd.exe中键入fileR.txt时,您会看到什么?
#include <stdlib.h>
#include <locale.h>
#include <clocale>
#include <stdio.h>
#include <conio.h>
#include <wchar.h>

int main()
{
    FILE *pF;
    wchar_t line[512]; // Current line

    setlocale(LC_ALL, "");
    pF = fopen("Aulas\\source\\fileR.txt", "r");

    while (!feof(pF))
    {
        fgetws(line, 512, pF);
        fputws(line, stdout);
    }

    return 0;
}
Letter ÃLetter b
Letter c
Letter Ã