Это просто совпадение.Суть проблемы в том функция substr не может корректно работать с многобайтными кодировками, к которым относится UTF-8, и режет не 100 символов а 100 байт.
Если объяснять на пальцах то в UTF-8 для латинских символов, знаков препинания и цифр используется 1 байт, а для наборов символов национальных кодировок, например кириллицы, используется 2 байта. Получается если в строке сотый символ однобайтный, то всё режется корректно, а если там где надо резать находится двухбайтный символ который занимает сотый и сто первый быйты, то при обрезании символ разрывается на две части. Вот этот огрызок символа и приводит к тому что появляются ромбики и прочая хрень. Человеку у которого жизнь наладилась при замене 100 на 160 просто повезло. 160-ый байт оказался однобайтным символом. И абсолютно не факт что так повезёт во всех строках.
По ссылке которую дал costas описывается как сделать что-бы строка всегда резалась по однобайтному символу.
Только используя этот метод надо учитывать что он режет не 160 символов, а примерно 160 байт и реальное количество символов в отрезанной строке зависит не только от слова в районе которого режется строка, а и от того сколько в строке однобайтных и двухбайтных символов. Грубо говоря если текст полностью на русском языке то длина строки будет чуть больше 80 символов. Это "чуть больше" обусловленно наличием в тексте пробелов, цифр, запятых, точек и других однобайтных символов.
Используйте решение предложенное costas'ом, пока не будет принято решение как будем затыкать эту проблему.
Вариантов есть много, например, для тех кто владеет навыками настройки серверов есть решение которое может решить проблему не только в этом месте, а везде где используются строковые функции не умеющие работать с многобайтными кодировками.
Суть метода:
Надо включить оверлоад строковых функций и указать внутреннюю кодировку символов по умолчанию
Если на сервере используется PHP версии ниже 5.2.8, то это можно сделать в .htaccess такими строками
php_value mbstring.func_overload 2
php_value mbstring.internal_encoding UTF-8
К сожалению это решение не идеально и при стечении некоторых обстоятельств могут наблюдаться глюки. Этой проблеме уже много лет и она до сих пор не решена, поэтому начиная с PHP 5.2.8 разработчики просто отключили возможность управления оверлоадом в .htaccess и тут прийдётся включать оверлоад в php.ini
Одним словом надо разбираться с каждым серваком отдельно и подбирать рабочее решение..
Существует только одно решение которое на 100% будет корректно работать у всех - подключать библиотеку для работы с UTF-8 и перелопачивать под неё весь код где нужны многобайтные функции.
Будет ли это сделано и в какие сроки - я не знаю.