繁体   English   中英

switch语句匹配非ascii字符

[英]switch statement matching non-ascii characters

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

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

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

代替case 'á' :我已经尝试了case '0x00E1' : case L 'u00E1 : case \\U000000E9 :case '\á' :我已经尝试了所有没有单引号的情况,在这种情况下它不会编译(例如,表示未在此范围内声明\\ u00E1)。

á是非ASCII字符,在源代码, struct dirent或两者中表示为多个字节。

如果你打开-Wmultichar你可能会得到警告

warning: multi-character character constant

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

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

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

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

我认为将switch表达式转换为unsigned类型就可以了。

switch((unsigned char)ent->d_name[i])
{
...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM