我在源代码中添加了字符,并尝试用等效的unicode替换它们。如果我使用实际的非ascii字符,程序将编译并正常工作,但我担心这可能会影响可移植性。当我尝试使用unicode等效时,我得到警告:案例标签值超过类型或警告的最大值:字符常量对于其类型太长,并且案例永远不会匹配我运行程序。
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' :
我尝试了所有内容,没有单引号,在这种情况下,将无法编译(例如,表示未在此范围内声明\ u00E1。)
答案 0 :(得分:2)
á
是一个非ASCII字符,在您的源代码struct dirent
或两者中都表示为多个字节。
如果您打开-Wmultichar
,您可能会收到警告
warning: multi-character character constant
表示字符常量'á'
由多个字节组成,在这种情况下,它可能是UTF-8,但检查(例如使用file
)。您还需要找出dirent
条目的编码。
为了匹配字符串中的非ASCII字符,您需要:
int
)或请查看http://en.cppreference.com/w/cpp/locale/codecvt_utf8以获取有关如何进行转化的示例。
答案 1 :(得分:0)
我认为将switch表达式转换为unsigned类型就可以了。
switch((unsigned char)ent->d_name[i])
{
...
}