Разница между функциями substr и mbsubstr при работе с многобайтовыми кодировками заключается в том, что substr некорректно работает с такими кодировками, а mbsubstr — корректно. 12
Это объясняется тем, что в многобайтовых кодировках, например UTF-8, символ закодирован с помощью от 1 до 6 байтов, а substr думает, что буква всегда кодируется одним байтом. 1 В результате получаются битые символы. 1
Таким образом, при работе с текстом, который потенциально может содержать многобайтовые символы, следует использовать mb_substr. 2
Пример: если в UTF-8 кириллица кодируется двумя байтами, то substr посчитает, что символ равен байту, и вырежет два байта с начала, что приведёт к потере части символа. 2