在C中指定字符'æ','ø'或'å'

时间:2014-09-15 15:44:39

标签: c unicode utf-8 character-encoding char

所以我有一个变量char c,我想将'å'分配给。如果我尝试c = 'å',我会在终端收到一条警告:warning: multi-character character constant [-Wmultichar]

  1. 什么是多字符常量?
  2. 如何将'æ''ø''å'分配给char c

3 个答案:

答案 0 :(得分:3)

  

什么是多字符常量?

这表示您的文本编辑器使用多个字节在源代码文件中存储字符,可能是因为它将其保存为UTF-8编码的Unicode字符。由于char只能容纳一个字节,因此您的编译器会告诉您此分配不会产生预期的效果,因为您尝试将多字节文字存储到只能容纳一个字节的变量中。

  

如何将'æ''ø''å'分配给char c

这取决于多种因素。 char可以存储0到255之间的值。 1 在ASCII中只定义0到127; 128到255仅在某些其他代码页中定义(例如,ISO-8859-1)。要在char中存储其中一个字符,您必须执行以下操作:

  1. 配置文本编辑器以使用代码页进行保存,该代码页对包含要存储的字符的每个字符使用一个字节。
  2. 配置编译器以使用此代码页读取源文件。 (以gcc为例,这将是-finput-charset=...。)
  3. 如果程序输出这些字符(标准输出或文件!),那么读取输出的任何内容也必须通知此代码页,以便它知道如何处理128到255范围内的字节。
  4. 如果这三者中的任何一个不匹配,那么你可能会看到编译器警告或垃圾输出所在的字符。

    您可以使用宽字符wchar_t)绕过大多数问题,这些字符通常足以存储任何Unicode代码点。您仍然必须确保文本编辑器和编译器对源中字符的编码达成一致,除非您使用\uNNNN Unicode转义序列,它可以表示C源中的任何Unicode代码点代码只使用与ASCII兼容的字符(这意味着编译器不必被告知源代码所在的代码页)。


    1 或-128至127; {C}标准未指定char的默认签名,但由于我们正在讨论字符,因此我假设0到255是预期范围。

答案 1 :(得分:2)

多字符常量是文字int,使用带有多个char的字符 - 文字语法,并且具有实现定义的值。

避免使用它们,除非您确实需要它们,否则希望将代码与您的实现联系起来并知道它们能够满足您的需求。
即使这样,一个更安全,更不易出错的方法就是从int明确地创建char - 常量 - 文字和运算符。

即使您只看到一个字符,为什么会出现该错误?

因为角色对不同的人意味着不同的东西,取决于他们的情绪和月亮的阶段:

  • Byte(通常也是八位字节,虽然这不是任何方式的同义词,尤其是在C语言中)。
  • Unicode codeunit。
  • Unicode codepoint。
  • Unicode Grapheme。
  • 其他字符集中的符号。

您当前的麻烦源于使用字符集,其中该符号不是单个C - char,即UTF-8。 如果您坚持将它们分配给单个char,请选择将它们作为单个字节的字符集 否则,请正确使用char s。

字符串

BTW:使用wchar_t可能会被用作创可贴,虽然UTF-16仍然可以使用多代码单元代码点(并且你更有可能在那里保留bug),甚至UTF -32具有多码点字形)。

答案 2 :(得分:1)

这些字符不在ASCII表中。 char的大小为1个字节,但是这些字符的编码需要超过1个字节,因此编译器会向您发出警告。您可能必须使用wchar_t类型并且特定于此类型函数。