【发布时间】:2021-09-09 05:58:25
【问题描述】:
我有一个分配,我必须找到文本文件中每个字符的频率,问题是我的第一个 lenguaje 是西班牙语,所以文本 fila 有重音字符,如“á”,我必须计算“á " 像 "a",我的代码是:
int main(){
int c;
FILE *file;
file = fopen("prueba.txt", "r");
int letters[27] = {0};
if (file){
while ((c=getc(file)) !=EOF )
{
if( ((c-65) >=0 && (c-65) <= 25)){
letters[c-65]++;
}
else if( (c-97) >=0 && (c-97) <= 25){
letters[c-97]++;
}
else if( c ==181 || c== 160){ //a
letters[0]++;
}
else if( c == 130 || c== 144){//e
letters[4]++;
}
else if(c ==161 || c==214){//i
letters[8]++;
}
else if(c == 162 || c ==224){
letters[14]++;
}
else if(c ==163 || c == 233){
letters[20]++;
}
else if( c==164 || c== 165){
letters[26]++;
}
}
fclose(file);
}
}
但我发现我的代码读取“á”就像一个多字符,所以 c 需要三个值 195,161,10 而不是 160,我该怎么办?
【问题讨论】:
-
请不要使用magic numbers!如果通过例如
65你的意思是'A'的 ASCII 编码值,那么最好明确地说'A'(即使你所做的无论如何都不是可移植的)。 -
还要注意ASCII实际上是一个七位编码,并且“扩展”字符(具有高于
127的值)将取决于操作系统及其设置。 -
á字符是encoded as UTF-8 in two bytes,其值为 225。第三个字节只是一个换行符。将 UTF-8 转换为十进制数很容易,但我不知道您应该如何找到所有可用于a变体的 the unicode code points。 -
也许使用 Unicode 库将文本转换为 NFD 形式,只查看基本字符而忽略组合字符?
-
这能回答你的问题吗? How to Read/Write UTF8 text files in C?
标签: arrays c character-encoding text-files non-ascii-characters