switch语句匹配非ascii字符

Cel*_*tas 7 c++ character-encoding

我在源代码中添加了字符,并尝试用等效的unicode替换它们.如果我使用实际的非ascii字符,程序将编译并正常工作,但我担心这可能会影响可移植性.当我尝试使用unicode等效时,我得到警告:case标签值超过typewarning的最大值:字符常量对于它的类型来说太长了,并且在运行程序时情况永远不会匹配.

for(int i = 0; i < ent->d_namlen; i++)
{
    switch(ent->d_name[i])
    {
        case 'á' : //0x00E1
        ...
    }
 }
Run Code Online (Sandbox Code Playgroud)

ent是struct dirent *ent从调用函数传递的.

在地方的case 'á' :我试过case '0x00E1' :,case L 'u00E1 :,case \U000000E9 :case '\u00E1' :我已经尝试了所有,而不单引号在这种情况下,它不会编译(例如说,\ u00E1没有在这个范围内声明).

eca*_*mur 2

\xc3\xa1是一个非 ASCII 字符,并且在源代码、struct dirent或两者中被表示为多个字节。

\n\n

如果您打开,-Wmultichar您可能会收到警告

\n\n
warning: multi-character character constant\n
Run Code Online (Sandbox Code Playgroud)\n\n

表明字符常量\'\xc3\xa1\'由多个字节组成,在这种情况下它可能是 UTF-8,但请检查(例如使用file)。您还需要找出dirent条目的编码。

\n\n

为了匹配字符串中的非 ASCII 字符,您需要:

\n\n
    \n
  • 确保字符串和字符以相同的编码表示,并且\n
      \n
    • 使用固定长度编码(即 UCS-4)和足够宽的类型来存储每个代码点(例如int),或者
    • \n
    • 使用可重新启动的可变长度编码(即UTF-8)并使用子字符串匹配。
    • \n
  • \n
\n\n

有关如何进行转换的示例,请参阅http://en.cppreference.com/w/cpp/locale/codecvt_utf8 。

\n