Понял что это связанно с htmlspecialchars, но как победить его так и не понял.
Во первых - зачем? В смысле какова цель вашей загадочной функции? Почистить строку? Обычно это делается при
выводе, а не при записи. Подготовить для вставки в бд? Для этого есть встроенные функции, но и они тут лишние, почему - читай ниже.
Во вторых - научитесь отладке. Если вы не знаете в чем вообще проблема, стоит посмотреть что и на каком этапе пошло не так, для этого в самом примитивном виде нужно использовать var_dump/print_r, ну или инструменты по типу xdebug.
И в третьих, или скорее даже в нулевых - все работы с запросами нужно вести через подготовленные выражения, тогда не нужны будут эти танцы со странным кодом, не делающим ничего полезного. Естественно все таблицы и соединение с бд должны быть в соответствующей кодировке, в вашем случае это скорее всего utf8mb4.