Ами, при UTF-8 една буква (кирилица) е 2 байта, а при CP1251 една буква (кирилица) е 1 байт.
Ако се ползва substr функцията, рязането на стринговете е на байтове (т.е. при CP1251 съвпада с буквите, но при UTF-8 не съвпада с броя на буквите)
Ако се ползва mb_substr функцията, рязането си е по букви, независимо коя буква колко байта е, но като допълнителен параметър се подава кодировката (или се задава глобално за скрипта)
Така че съвсем не е изключено дължината на отрязване да варира според кодировката, но аз се съмнявам да е така по две причини:
1. IPB не са толкова тъпи, че да ползват substr вместо mb_substr
Въпреки, че това се опровергава от този ред код, който е грешен по няколко различни параметъра:
$string = substr( $r['post'], 0, 30 ) . '...';
2. Ако кодировката беше причината - щеше да дава грешки при UTF-8
3. Ако кодировката беше причината - в някои случаи последният символ от отрязания стринг щеше да завършва с въпросителна (случва се, когато последният символ е от два байта, а функцията го е отрязала през средата и е останал единият байт, а вторият липсва)