在C中读取非英文字符的文本文件

时间:2017-01-18 22:18:45

标签: c text non-english

是否可以阅读文本文件帽子有非英文文本?

文件中的文字示例:

  

E 37

     

SVAR:

     

Fettembolisyndrom。 (1poäng)

使用“puts”存储“fread”输出的缓冲区中的内容示例:

  

E 37 SVAR:

     

Fettembolisyndrom。   (1po├ñng)

在Linux下,我的程序工作正常,但在Windows中我看到非英文字母的问题。有人建议如何解决这个问题?

程序:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

int debug = 0;

int main(int argc, char* argv[])
{
    if (argc < 2)
    {
        puts("ERROR! Please enter a filename\n");
        exit(1);
    }
    else if (argc > 2)
    {
        debug = atoi(argv[2]);
        puts("Debugging mode ENABLED!\n");
    }

    FILE *fp = fopen(argv[1], "rb");
    fseek(fp, 0, SEEK_END);
    long fileSz = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    char* buffer;
    buffer = (char*) malloc (sizeof(char)*fileSz);
    size_t readSz = fread(buffer, 1, fileSz, fp);
    rewind(fp);

    if (readSz == fileSz)
    {
        char tmpBuff[100];
        fgets(tmpBuff, 100, fp);

        if (!ferror(fp))
        {
            printf("100 characters from text file: %s\n", tmpBuff);
        }
        else
        {
            printf("Error encounter");
        }
    }

    if (strstr("FRÅGA",buffer) == NULL)
    {
        printf("String not found!");
    }

    return 0;
}

Sample output

Text file

1 个答案:

答案 0 :(得分:0)

摘要:如果您从以UTF-8编码的文件中读取文本并将其显示在控制台上,您必须将控制台设置为UTF-8或将文本从UTF-8转码为控制台使用的编码(在英语国家,通常是MS-DOS代码页437或850)。

更长的解释

字节不是字符,字符不是字节。 C中的char数据类型包含一个字节,而不是字符。特别是,注释中提到的字符Å(Unicode <U+00C5>)可以用多种方式表示,称为编码

  • 在UTF-8中,它是两个字节,'\xC3' '\x85';
  • 在UTF-16中,它是两个字节,'\xC5' '\x00'(小端UTF-16)或'\x00' '\xC5'(大端UTF-16) );
  • 在Latin-1和Windows-1252中,它是一个字节'\xC5';
  • 在MS-DOS代码页437和代码页850中,它是一个字节'\x8F'

程序员有责任在程序使用的内部编码(通常但不总是Unicode),输入或输出文件中使用的编码以及显示设备所需的编码之间进行转换。

注意:有时候,如果程序对读取和输出的字符没有太大作用,可以通过确保输入文件,输出文件和显示设备都使用相同的编码来实现。在Linux中,此编码几乎总是UTF-8。不幸的是,在Windows上存在多种编码是生活中的事实。系统调用期望UTF-16或Windows-1252。默认情况下,控制台显示代码页437或850.文本文件通常采用UTF-8格式。 Windows陈旧而复杂。