我在C中创建了一个程序,它可以替换或删除字符串中的所有元音。此外,我希望它适用于这些角色:'æ','ø','å'。
我曾尝试使用strstr(),但我没有设法实现它而不替换包含'æ','ø'或'å'的行上的所有字符。 我也读过wchar,但这似乎只是让一切变得复杂。
该程序正在使用这一系列字符:
char vowels[6] = {'a', 'e', 'i', 'o', 'u', 'y'};
我试过这个数组:
char vowels[9] = {'a', 'e', 'i', 'o', 'u', 'y', 'æ', 'ø', 'å'};
但它会发出以下警告:
警告:多字符字符常量[-Wmultichar]
警告:隐式常量转换溢出[-Woverflow]
如果我想用'a'替换每个元音,则用' a'替换'å'。
我也试过'{3}}'æ','ø'和'å'。
char extended[3] = {"\xc3\xa6", "\xc3\xb8", "\xc3\xa5"};
但它会出现此错误:
char数组初始值设定项中的多余元素
有没有办法让这项工作变得过于复杂?
答案 0 :(得分:4)
有两种方法可以使该角色可用。第一个是code pages,它允许你use extended ASCII characters(值128-255),但代码页依赖于系统和语言环境,所以一般来说这是一个坏主意。
更好的选择是使用unicode。 unicode的典型情况是使用宽字符文字like in this post:
wchar_t str[] = L"αγρω";
您的代码的关键问题是您正在尝试compare ASCII with UTF8, which can be a problem。解决方案很简单:将所有文字转换为宽字符UTF8等效项以及字符串。您需要使用通用编码而不是混合它,除非您有转换功能来帮助解决。
答案 1 :(得分:4)
了解UTF-8(包括与Unicode的关系)并使用一些UTF-8库:来自GTK的libunistring,utfcpp,Glib,{ {3}} ....
您需要了解您使用的ICU。
我强烈建议 character encoding在所有情况下(这是大多数Linux系统和几乎所有互联网和网络服务器的默认设置;请阅读UTF-8& {{3 }})。 阅读locale(7) ....
我不建议wchar_t
的宽度,范围和符号是特定于实现的(您无法确定Unicode是否适合wchar_t
;有传言说在Windows上它不适合)。将UTF-8输入转换为Unicode / UCS4也很耗时,不仅仅是处理UTF-8 ......
请理解,在UTF-8中,字符可以用几个字节进行编码。例如,ê
(法语强调utf8(7)小写)以两个字节0xc3, 0xaa
编码,ы
(俄语utf8everywhere小写)编码为两个字节0xd1, 0x8b
,两者都被认为是元音,但两者都不适合char
(你和我的机器上的8位字节)。
e circonflexe的概念很复杂(例如俄语,阿拉伯语,日语,希伯来语,切诺基语,印地语等元音是什么元素),所以可能没有简单的解决方案来处理你的问题(因为UTF) -8有yery)。
您确定æ
和œ
是字母还是元音? (FWIW,å
& œ
& æ
在Unicode中被分类为字母和小写字母)。我在法语小学被教导他们是vowel(法语词典并没有将它们称为字母,因此œuf
位于oeuf
的字典中,这意味着< EM>蛋)。但我不是这方面的专家。请参阅combining characters。
在Linux上,由于UTF-8是默认编码(并且在最近的发行版中越来越难以获得其他版本),我不建议使用wchar_t
,而是使用UTF-8 {{1 (例如,处理多字节编码的UTF-8的函数)(使用ligatures UTF8和Unicode函数):
char
我不确定我的功能名称是否正确;但是你在评论中告诉我,Norvegian(我不知道)没有比我的功能更多的元音字符。
我故意将UTF-8放在文字字符串或宽字符文字中(仅在注释中)。还有其他过时的字符编码(阅读strcoll(3)或Glib),您可能希望交叉编译代码。