При преобразовании строки в требуемую кодировку к кодировке, требуемой на выходе можно добавить параметр TRANSLIT или IGNORE. Первый включает режим транслитерации и заменяет проблемный символ на один или несколько наиболее близких по внешнему виду. Ключевое слово — заменяет. Возможно, наиболее близким символом будет знак вопроса, но тем не менее. Второй параметр удаляет те символы, которые не могут быть представлены в требуемой кодировке.
В комментариях к документации один из пользователей упомянул про символ, который не получается проигнорировать — на нём даже с параметром IGNORE iconv падает с ошибкой «Detected an illegal character in input string». И поэтому появилась рекомендация использовать одновременно два параметра: //TRANSLIT//IGNORE — типа, игнорировать всё, что не удалось транслитерировать. Однако, повторюсь, параметр TRANSLIT заменяет все проблемные символы, после него уже нечего игнорировать. В итоге получаем такую картину:
// работает iconv('utf-8', 'windows-1251//TRANSLIT', '∙'); iconv('utf-8', 'windows-1251//TRANSLIT//IGNORE', '∙'); // падает с ошибкой Detected an illegal character in input string iconv('utf-8', 'windows-1251//IGNORE', '∙'); iconv('utf-8', 'windows-1251//IGNORE//TRANSLIT', '∙');
В итоге имеем бессмысленные комбинации //TRANSLIT//IGNORE и //IGNORE//TRANSLIT, которые встречаются в ответах на SO.