如何使用'æ''ø';和'å';在C中
我用C语言编写了一个程序,可以替换或删除字符串中的所有元音。此外,我希望它能为这些角色工作:“æ”、“ø”、“å” 我曾尝试使用strstr(),但如果不替换包含“æ”、“ø”或“å”的行中的所有字符,我就无法实现它。 我也读过,但这似乎只会使事情复杂化 程序正在使用此字符数组:如何使用'æ''ø';和'å';在C中,c,arrays,replace,char,wchar,C,Arrays,Replace,Char,Wchar,我用C语言编写了一个程序,可以替换或删除字符串中的所有元音。此外,我希望它能为这些角色工作:“æ”、“ø”、“å” 我曾尝试使用strstr(),但如果不替换包含“æ”、“ø”或“å”的行中的所有字符,我就无法实现它。 我也读过,但这似乎只会使事情复杂化 程序正在使用此字符数组: char vowels[6] = {'a', 'e', 'i', 'o', 'u', 'y'}; 我尝试使用此阵列: char vowels[9] = {'a', 'e', 'i', 'o', 'u', 'y', '
char vowels[6] = {'a', 'e', 'i', 'o', 'u', 'y'};
我尝试使用此阵列:
char vowels[9] = {'a', 'e', 'i', 'o', 'u', 'y', 'æ', 'ø', 'å'};
但它给出了以下警告:
警告:多字符字符常量[-Wmultichar]
警告:隐式常量转换中溢出[-Woverflow]
如果我想用“a”替换每个元音,它会用“a”替换“å”�a”
我也试过使用“æ”、“ø”和“å”的形式
char extended[3] = {"\xc3\xa6", "\xc3\xb8", "\xc3\xa5"};
但它给出了这样一个错误:
字符数组初始值设定项中的多余元素
有没有一种方法可以让这个角色在不太复杂的情况下工作?有两种方法可以让这个角色变得可用。第一个是,这将允许您(值128-255),但代码页依赖于系统和语言环境,所以一般来说这是一个坏主意 更好的选择是使用。unicode的典型情况是使用宽字符文本: 您的代码的关键问题是您正在尝试。解决方法很简单:将所有文本以及字符串转换为宽字符UTF8等价物。您需要使用通用编码,而不是混合编码,除非您有转换函数提供帮助。了解(包括其与的关系)并使用一些UTF-8库:,来自GTK 你需要了解你在用什么 我强烈建议在所有情况下使用(这是大多数Linux系统以及几乎所有Internet和web服务器的默认设置;请阅读&)。 读 我不推荐宽度、范围和符号特定于实现的
wchar\u t
(您不能确定Unicode是否适合wchar\u t
;有传言说在Windows上它不适合)。此外,将UTF-8输入转换为Unicode/UCS4可能会非常耗时,而不仅仅是处理UTF-8
请务必理解,在UTF-8中,字符可以用几个字节编码。例如,ê
(法语重音小写)用两个字节编码0xc3、0xaa
,ê
(俄语小写)用两个字节编码0xd1、0x8b
,两者都被视为元音,但都不适合一个char
(在您和我的机器上是一个8位字节)
元音的概念很复杂(例如,俄语、阿拉伯语、日语、希伯来语、切罗基语、印地语等的元音是什么),因此可能没有简单的解决方案(因为UTF-8有)
你确定æ
和œ
是字母还是元音?(FWIW,å
和œ
和æ
在Unicode中被分类为字母和小写)。我在法国小学时被教导它们是(法语词典没有把它们作为字母提到,所以œuf
在词典中位于oeuf
,意思是鸡蛋)。但我不是这方面的专家。看
在Linux上,由于UTF-8是默认编码(并且在最近的发行版中越来越难找到其他编码),我不建议使用wchar\u t
,而是使用UTF-8char
(因此处理多字节编码UTF-8的函数),例如(使用UTF8和Unicode函数):
我不确定我的函数名是否正确;但你在评论中告诉我,Norvegian(我不知道)的元音字符数不超过我的函数计数
我并没有将UTF-8放在文字字符串或宽字符文字中(仅在注释中),这是有意的。还有其他过时的字符编码(了解或),您可能希望交叉编译代码。请说明您正在使用的标准版本,以及您是否尝试使用C11以及编译器使用的源/目标字符编码。请注意,例如,
UTF-8
(gcc的默认值)具有可变长度的字符,因此char
将不足以在单个char
变量中保存ASCII以外的任何内容。如何确定我使用的是哪个版本?我还没有试过使用C11,我不知道该怎么做。我用这行代码编译:>gcc-Wall-g-o filename.cTrychar-extended[3][3]={“\xc3\xa6”、“\xc3\xb8”、“\xc3\xa5”}
这些字符不能放入字符中。您必须使用wchar\u t
、char16\u t
或char32\u t
。阅读更多@luuvinphuc:No您不必使用wchar\u t
(其宽度因不同的实现或操作系统而异),但您应该像我在回答中所做的那样使用UTF\u多字节char
。我通过在我的代码中进行以下替换来完成这项工作:char->wchar\u t,strcpy()->wcscpy(),strlen()->wcslen(),printf(“%s”,str)->printf(“%ls”,str)。我只缺少getline()的替换项。没有“扩展ASCII字符”。“代码页”特定于一系列操作系统。将ASCII与UTF8进行比较绝对没有问题,因为UTF8是专门为ASCII兼容而设计的。@n.m.我不同意。扩展ASCII(或高ASCII)是8位或更大的字符编码,包括标准的7位ASCII字符以及其他字符。该术语的使用有时会受到批评[1][2][3],因为它可能被错误地解释为ASCII标准已更新为包含128个字符以上,或者该术语明确地标识了单个编码,我相信在Linux上使用UTF-8char
比使用wchar_t
Basile要好得多,你会如何使用像“æ”、“ø”这样的字母
wchar_t str[] = L"αγρω";
unsigned count_norvegian_lowercase_vowels(const char*s) {
assert (s != NULL);
// s should be a not-too-big string
// (its `strlen` should be less than UINT_MAX)
// s is assumed to be UTF-8 encoded, and should be valid UTF-8:
if (!g_utf8_validate(s, -1, NULL)) {
fprintf(stderr, "invalid UTF-8 string %s\n", s);
exit(EXIT_FAILURE);
};
unsigned count = 0;
char* next= NULL;
char* pc= NULL;
for (pc = s; *pc != '\0' && ((next=g_utf8_next_char(pc)), *pc); pc=next) {
g_unichar u = g_utf8_get_char(pc);
// comments from OP make me believe these are the only Norvegian vowels.
if (u=='a' || u=='e' || u=='i' || u=='o' || u=='u' || u=='y'
|| u==(g_unichar)0xa6 //æ U+00E6 LATIN SMALL LETTER AE
|| u==(g_unichar)0xf8 //ø U+00F8 LATIN SMALL LETTER O WITH STROKE
|| u==(g_unichar)0xe5 //å U+00E5 LATIN SMALL LETTER A WITH RING ABOVE
/* notice that for me ы & ê are also vowels but œ is a ligature ... */
)
count++;
};
return count;
}