我如何从文件中读取和处理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
答案 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。如果您不想打印字符,这不是问题。ccs=UTF-8
将不是必需的)。即使在Windows中我们仍然使用一种语言,仍然必须以UTF-8读取该文件。我以此为例:
¿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以检查输出)。