Искажение символов на PHP-сайте
В одном из проектов пришлось столкнуться со следующей задачей: в конце строки использовался символ кириллицы русская буква «г» с предшествующим пробелом. Нужно было скриптом удалить ее.
Попробовал использовать следующий код:
$stroka=trim($stroka,’ г’);
Все прекрасно работало, пока сайт не переехал на кодировку UTF-8 (ранее использовалась Windows-1251)
После смены кодировки выяснилась одна особенность работы функции trim в php: эта функция не поддерживает кодировку и просто просматривает отдельные байты. Если отправлять вторым аргументом символы кириллицы закодированной в UTF-8, то в строке будут искаться байты в соответствии с кодировкой, с чем trim справляется не совсем корректно, попутно удаляя лишние байты, приводя к искажению некоторых символов на сайте, например, в рассматриваемом случае всегда происходило искажение первого символа в строке и вместо него выводился символ �.
Результат поисков решения привел к отказу от использования функции trim, благо, функционал php довольно разнообразен. Рассмотрев варианты было принято решение использовать замену регулярными выражениями:
$stroka=preg_replace('/ г$/u', '',$stroka']);Code language: PHP (php)
После проведенной замены искажение символов перестало происходить.