如何在文件中的c中的一个字符中读取和处理utf-8字符

时间:2016-07-14 17:29:49

标签: c utf-8

我如何从文件中读取和处理c中一个字符中的utf-8字符 这是我的代码

FILE *file = fopen(fileName, "rb");
    char *code;
    size_t n = 0;
    if (file == NULL) return NULL;
    fseek(file, 0, SEEK_END);
    long f_size = ftell(file);
    fseek(file, 0, SEEK_SET);
    code = malloc(f_size);
    char a,b;
    while (!feof(file)) {
        fscanf(file, "%c", &a);
        code[n++] = a;
       // i want to modify "a" (current char) in here
    }
    code[n] = '\0'; 

这是文件内容

  

〜”م“我أK·¶; R0ثp9'   -Ë'“گAéI,ہzy,لKŒA A A A A A A A A A A A A A A A A A A A A A A A A A |ںJR(TISش - [R

1 个答案:

答案 0 :(得分:-2)

Chars通常可以保存255个不同的值(1个字节),换句话说,就是ASCII表(如果你使它无符号,它可以使用扩展表)。对于处理UTF-8字符,我建议使用其他类型,如wchar_t(如果宽字符in your compiler表示为UTF-8),否则使用char_32如果您使用的是C + +11,或处理您的数据的库,如ICU

修改

此示例代码解释了如何在C中处理UTF-8。请注意,您必须确保编译器中的wchar_t可以存储UTF-8。

#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <wchar.h>
main() {
    FILE *file=fopen("Testing.txt", "r, ccs=UTF-8");
    wchar_t sentence[100000], ch=1;
    int n=0;
    char*loc = setlocale(LC_ALL, "");
    printf("Locale set to: %s\n", loc);
    if(file==NULL){
        printf("Error processing file\n");
    } else {
        while((ch = fgetwc(file)) != 65535){
            /* The end of file value may vary depending of the wchar_t!*/
            /* wprintf(L"%lc", ch); */
            sentence[n]=ch+1; /*Example modification*/
            n++;
                }
    }
    fclose(file);
    file=fopen("Testing.txt", "w, ccs=UTF-8");
    fputws(sentence, file);
    wprintf(L"%ls", sentence);
    fclose(file);
    return 0;
}
  • 您的系统区域设置
    char*loc = setlocale(LC_ALL, "");将帮助您查看当前的系统区域设置。如果您使用的是linux,请确保使用的是UTF-8,如果您使用的是Windows,那么您必须stick to one language。如果您不想打印字符,这不是问题。
  • 如何打开文件
    首先,我为reading it as text file打开它,而不是将其作为二进制文件读取。此外,我必须使用UTF-8格式化打开文件(我认为在linux中它将作为您的语言环境,因此ccs=UTF-8将不是必需的)。即使在Windows中我们仍然使用一种语言,仍然必须以UTF-8读取该文件。
  • 使用带有字符的兼容功能
    为此,我们将使用wchar.h库中的函数(如wprintf和fgetwc)。其他功能的问题在于它们仅限于char的范围,给出了错误的值。

我以此为例:

  

¿khñà?
  你好
  〜“م'iاk·¶;R0Ëp9'-Ë'”گAéI,ہہ,H KضA A A A A}}}}}}}}}}}}}}}}}}}}}}}}}}}} h h h h OU OU;;;;;;;(((((( £F 6pG |ںJr(TîsشR

在程序的最后部分用覆盖的修改后的字符串覆盖文件 您可以尝试将sentence[n]=ch+1;更改为sentence[n]=ch;以检入原始文件,如果它正确读取并输出文件(并取消注释wprintf以检查输出)。