На ваш вопрос:
Подумайте, если у меня есть неподписанный или неподписанный массив символов, может ли это заставить мою программу работать неправильно? - drigoSkalWalker
Да. Мой сделал. Вот простая исполняемая выдержка из моего приложения, которая совершенно неверна при использовании обычных подписанных символов.
Попробуйте запустить его после изменения всех символов без знака в параметрах. Как это:
int is_valid ( без знака 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.
Две другие причины, по которым я могу придерживаться unsigned при работе с utf-8:
Если вам может понадобиться сдвиг битов вправо, могут возникнуть проблемы, потому что тогда вы можете добавить 1 слева, если используете подписанные символы.
utf-8 и unicode используют только положительные числа, так что ... почему вы тоже? сохраняя это простым:)