也许我错过了一些明显的东西,但是有一种“无痛”的方式来替换给定文本中的重音字母与他们的非重音同行吗?我只能使用标准的ANSI C库/标题,所以我的双手都是绑定的。到目前为止我尝试过的:
unsigned char currentChar;
(...)
if (currentChar == 'à') {
currentChar = 'a';
}
else if (currentChar == 'è' || currentChar == 'é') {
currentChar = 'e';
}
else if (...)
然而,这不起作用。使用扩展的ASCII值检测带重音的元音也不是一种选择,因为我注意到它会根据系统区域设置而改变。
任何提示/建议?
(更新)
感谢您的回答,但我并不是真的要求解决这个问题的最佳方法 - 我稍后会考虑这个问题。我只是想要一种方法来检测带重音的元音,因为上面的代码只是忽略了它们。
(更新#2)
好。让我澄清一下:
#include <stdio.h>
int main(void) {
int i;
char vowels[6] = {'à','è','é','ì','ò','ù'};
for (i = 0; i < 6; i++) {
switch (vowels[i]) {
case 'à': vowels[i] = 'a'; break;
case 'è': vowels[i] = 'e'; break;
case 'é': vowels[i] = 'e'; break;
case 'ì': vowels[i] = 'i'; break;
case 'ò': vowels[i] = 'o'; break;
case 'ù': vowels[i] = 'u'; break;
}
}
printf("\n");
for (i = 0; i < 6; i++) {
printf("%c",vowels[i]);
}
printf("\n");
return 0;
}
此代码仍然打印“àèéìòù”作为输出。这是我的问题。我很欣赏这些答案,但是告诉我实现转换映射或交换机/案例结构是没有意义的。我会考虑以后。
答案 0 :(得分:3)
重音字符可能是UTF-8字符集或其他编码的一部分。您的程序使用char
类型,通常使用ASCII character set。
在ASCII字符集中,每个字符由单个字节表示。此字符集不包含重音字符。
其他编码包括字符,但它可能不是由单个字节表示,因此您的代码无法处理。解决方法通常是使用宽字符。
您需要的是wide characters。
This question可能有更一般的解释。
This question可以为您的案例提供解决方案。
此代码似乎符合您的要求:
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main(int argc, char **argv){
setlocale(LC_CTYPE, "");
FILE *f = fopen(argv[1], "r");
if (!f)
return 1;
for (wchar_t c; (c = fgetwc(f)) != WEOF;){
switch (c) {
case L'à': c=L'a'; break;
case L'è': c=L'e';break;
case L'é': c=L'e';break;
case L'ì': c=L'i';break;
case L'ò': c=L'o';break;
case L'ù': c=L'u';break;
default: break;
}
wprintf(L"%lc", c);
}
fclose(f);
return 0;
}
答案 1 :(得分:1)
可能有一种更简单的方法,一些我没有听说过的现有功能,但就结构而言,这就是我接近它的方式:
构建一个由重音字符和结果字符组成的字符转换表。然后构建一个简单的循环来扫描每个字符的表格,如果找到,则进行更改。
答案 2 :(得分:1)
如果你写
if ( currentChar == (unsigned char)('è'))...
你的方法应该工作,因为你只使用std c库的约束我不知道你怎么把它拉下来。
答案 3 :(得分:1)
Lets try this one:
char p_RemoveAccent(char C)
{
#define ACCENT_CHARS "ÁÀÃÂÇáàãâçÉÊéêÍíÑÓÔÕñóôõÚÜúü"
#define UNACCENT_CHARS "AAAACaaaacEEeeIiNOOOnoooUUuu"
const char *p_Char = memchr(ACCENT_CHARS, C, sizeof(ACCENT_CHARS));
return (p_Char ? UNACCENT_CHARS[(p_Char - ACCENT_CHARS)] : C);
}