kruglov
Если мне не изменяет память, то функция isalpha стандартной библиотеки языка С нормально обработает букву с кодом 255, так как она принимает параметр типа int
Потому что у нее код 255 = EOF
255 != EOF
EOF в С определен как
#define EOF (-1)
тоесть по умолчанию он имеет тип int.
Дальнейшие мои рассуждения основаны на версии php 5.2.3, так как исходников других версий у меня нет.
В коде файла ext/standard/string.c есть такая строчка:
Код:
while (p < e && (isalpha(*p) || (char_list && ch[(unsigned char)*p]) || *p == '\'' || *p == '-')) {
Как мы видим в ней функции isalpha передается разыменованый указатель p, который имеет тип char*. Вот тут то и начинаются преобразования. 255 - это 8 единиц в битовом представлении. Для типа char это равносильно числу -1 Вот тут происходит преобразование типа с char в int и в функцию isalpha передается -1, а не 255(как мы ждали).
Для исправления этой ситуации достаточно принудительно преобразовать *p к типу unsigned char, тоесть если написать вызов isalpha таким образом:
Код:
isalpha([b](unsigned char)[/b]*p)
То буква "я" должна будет обрабатываться нормально.
P.S. Все вышесказанное писал по памяти, так как скомпилировать и проверить у меня сейчас возможности нет.