c - 在纯 C 中打开一个 Unicode 文件

标签 c unicode fopen cjk wchar-t

我正在尝试打开一个全中文的 .txt 文件。我可以对它使用普通的 fopen/fclose 过程,即使流是 100% Unicode 还是有任何处理宽字符的专用工具?如果您能提供准确的答案,我将不胜感激,我是一名初学者程序员。我正在使用带有标准 gcc 的 Linux。

我将附上我的代码,它编译时没有错误,但在执行时出现段错误。我不知道它有什么问题。该程序的重​​点是复制每个中文符号字符串,其中要找到给定集合中的特定符号,并将其写入单独的文件中。

#include<stdio.h>
#include<stdlib.h>
#include<wchar.h>
#include <locale.h>
#define PLIK_IN in /*filenames*/
#define PLIK_OUT out
#define LKON 49 /*specifying the length of a string on the left from a desired sign*/
#define PKON 50 /*...and on the right*/
int wczytaj_pliki(FILE*, FILE*); /*open file*/
void krocz_po_pliku(FILE*, FILE*); /*search through file*/
int slownik(wchar_t); /*compare signs*/
void zapisz_pliki(FILE*, FILE*); /*write to file*/

void main(void)
{
    FILE *bin,*bout;
    setlocale(LC_CTYPE, "");

    wczytaj_pliki(bin, bout);
    krocz_po_pliku(bin, bout);
    zapisz_pliki(bin, bout);
}/*main*/

int slownik(wchar_t znak) /*compare characters*/
{
    wchar_t gznak1 = L'股', gznak2 = L'利', gznak3 = L'红';
    if ( ( znak == gznak1) || (znak == gznak2) || (znak == gznak3) ) return 1;
    return 0;
}/*slownik*/

void krocz_po_pliku(FILE* bin, FILE* bout) /*search through file*/
{
    wchar_t wch;
    wchar_t* kontekst;
    int i = 0, j, step = LKON, counter = 0, token = 0;

    while ( (wch = getwchar() ) != EOF )
    {
        if (!token) /*comparing consecutive signs*/
    {
        if ( slownik(wch) == 1 )
        {
            counter++;
            fprintf(bout,"###Wystapienie %d.\n\n", counter);
            if ( i<step ) step = i;
            fseek(bin,-step,1);
            j=0, token = 1;
        }/*if*/
        else i++;
    }/*if*/
    else /*writing consecutive signs within context*/
    {
        if ( j < LKON + PKON)
        {
            putwc(wch, bout);
            j++;
        }/*if*/
        else
        {
            fprintf(bout,"###\n\n");
            fflush(bout);
            token = 0;
        }/*else*/
    }/*else*/
    }/*while*/
        printf("Znalazlem %d wystapien\n", counter);
}/*krocz_po_pliku*/

int wczytaj_pliki(FILE* bin, FILE* bout)
{
    bin=fopen("PLIK_IN","r");
    bout=fopen("PLIK_OUT","w");
    rewind(bin);
    if(bin==NULL || bout==NULL)
{
    printf("Blad plikow\n");
    exit(0);
}/*if*/
    return 1;
}/*wczytaj pliki*/

void zapisz_pliki(FILE* bin, FILE* bout)
{
fclose(bin);
fclose(bout);
}

最佳答案

是的,fopen 可以打开包含任何数据(包括 Unicode 数据)的文件,只要您可以用 char* 表示文件名即可。 (在某些平台上,即 Windows,文件的名称可能无法用 char* 表示)。

您将希望以二进制模式打开文件以防止可能完成的任何新行替换(除非 Unicode 编码为 UTF-8 并且这无关紧要),因为替换将根据字符。此外,如果代码单元超过一个字节,您将需要确保以正确的字节顺序读取它们。

请注意,wchar_t 不一定是 Unicode,对于您的文件使用的任何 Unicode 编码,它可能不是正确的类型。如果您的程序支持多种 Unicode 编码,请不要使用 BOM 来猜测文件使用的编码。

关于c - 在纯 C 中打开一个 Unicode 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8314361/

相关文章:

c - 如何正确初始化链表

c++ - 在您指定的 wxWidgets 目录中找不到匹配的调试配置。

php - 写入文件很慢

c++ - 在 C++ linux 中使用 glib.h 中的 GMainLoop 而不是 "while(true);"有什么优势?

java - vaadin中的一些粗体

java - 如何在Java中查找无法存储在MySQL “utf8”列中的字符

css - 在哪里可以找到数据图标 unicode 值

c - fopen 文件名以奇怪的点开头

c - 从C语言的文本文件中逐字读取

c++ - 当 C++ 实现向 C 代码抛出异常时会发生什么