Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用'æ''ø';和'å';在C中_C_Arrays_Replace_Char_Wchar - Fatal编程技术网

如何使用'æ''ø';和'å';在C中

如何使用'æ''ø';和'å';在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', '

我用C语言编写了一个程序,可以替换或删除字符串中的所有元音。此外,我希望它能为这些角色工作:“æ”、“ø”、“å”

我曾尝试使用strstr(),但如果不替换包含“æ”、“ø”或“å”的行中的所有字符,我就无法实现它。 我也读过,但这似乎只会使事情复杂化

程序正在使用此字符数组:

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-8
char
(因此处理多字节编码UTF-8的函数),例如(使用UTF8和Unicode函数):

我不确定我的函数名是否正确;但你在评论中告诉我,Norvegian(我不知道)的元音字符数不超过我的函数计数


我并没有将UTF-8放在文字字符串或宽字符文字中(仅在注释中),这是有意的。还有其他过时的字符编码(了解或),您可能希望交叉编译代码。

请说明您正在使用的标准版本,以及您是否尝试使用C11以及编译器使用的源/目标字符编码。请注意,例如,
UTF-8
(gcc的默认值)具有可变长度的字符,因此
char
将不足以在单个
char
变量中保存ASCII以外的任何内容。如何确定我使用的是哪个版本?我还没有试过使用C11,我不知道该怎么做。我用这行代码编译:>gcc-Wall-g-o filename.cTry
char-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-8
char
比使用
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;
  }