7

我在源代码中添加了重音字符,并尝试将它们替换为等效的 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 没有在这个范围内声明)。

4

2 回答 2

2

á是一个非 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了解如何进行转换的示例。

于 2012-08-22T14:25:43.143 回答
0

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

switch((unsigned char)ent->d_name[i])
{
...
}
于 2012-08-22T12:09:08.740 回答