关于你的问题:
如果我有一个带符号或无符号的字符数组,会导致我的程序运行错误吗?- drigoSkalWalker
是的。我的确遇到过这种情况。以下是我的应用程序中的简单可运行代码片段,如果使用普通的有符号字符,则完全出错。
在将所有参数中的字符更改为无符号后尝试运行它。像这样:
int is_valid(unsigned char c);
然后它应该正常工作。
#include <stdio.h>
int is_valid(char c);
int main() {
char ch = 0xFE;
int ans = is_valid(ch);
printf("%d", ans);
}
int is_valid(char c) {
if((c == 0xFF) || (c == 0xFE)) {
printf("NOT valid\n");
return 0;
}
else {
printf("valid\n")
return 1;
}
}
它的作用是验证字符是否为utf-8中的有效字节。
0xFF和0xFE不是utf-8中的有效字节。
如果函数验证它为有效字节,就会出现问题,请想象一下。
发生的情况是这样的:
0xFE
=
11111110
=
254
如果您将此保存在普通字符中(即有符号字符),则最左边的位,即最高有效位,会使其变为负数。但这是什么负数呢?
它通过翻转位并添加一位来实现这一点。
11111110
00000001
00000001 + 00000001 =
00000010 = 2
记住它变成了负数,所以它变成了-2。
所以在函数中(-2 == 0xFE)当然是不正确的。
对于(-2 == 0xFF)也是一样。
因此,检查无效字节的函数最终会将无效字节验证为有效字节 :-o。
我可以想到坚持使用无符号字符处理utf-8的另外两个原因:
如果您可能需要向右进行一些位移,则可能会出现问题,因为如果使用有符号字符,则可能会从左侧添加1。
utf-8和unicode仅使用正数,那么...为什么您不这样做呢?保持简单 :)