To replicate mb_strtolower() without mbstring, maybe try to use a ICU transliterator like Transliterator::create('Lower') (possibly wrapped in NFD/NFC normalization), maybe like (didnt check) $lower = Normalizer::normalize(Transliterator::create('Lower')->transliterate(Normalizer::normalize($text, Normalizer::FORM_D)), Normalizer::FORM_C);