У меня есть странная ошибка на моем сайте: у меня есть переменная get в url ?getClass=9а
По какой-то причине, когда я выводил ее strlen, она на 1 символ больше, чем на самом деле. Например:
9a strlen - 3
10a strlen - 4
11a strlen - 4
Другая странная вещь заключается в том, что, когда я пытаюсь подстроить, используя это strlen:
$classNumber=substr($_GET['getClass'],0,strlen($_GET['getClass']-1));
$classLetter=substr($_GET['getClass'], strlen($_GET['getClass']-1));
Результат выглядит так: 9a $ classNumber = 9 $ classLetter = а, что нормально
10а $ classNumer = 1 $ classLetter = 0a, что неправильно
11a $ classNumber = 11 $ classLetter = a, что снова ок. Что с этим не так?
Это правильный ответ был первоначально размещен на user4035 но downvoted и удалены по какой - то причине.
Причина такого поведения заключается в том, что вы используете кириллицу "а", а не латинскую. И он считается символом юникода, представленным 2 байтами. Вам нужно использовать функцию mb_strlen:
<?php
print strlen($_GET['getClass'])."<br>";
print mb_strlen($_GET['getClass'], 'utf8');
Для ввода: "9а" он будет печатать:
3
2
Но если вы используете простой ASCII, функции будут давать тот же результат:
Getclass= 99
2
2
Вы должны вычитать -1 из результата strlen не из строки.
$classNumber=substr($_GET['getClass'],0,strlen($_GET['getClass'])-1);
$classLetter=substr($_GET['getClass'], strlen($_GET['getClass'])-1);