Php работа с регистром русских символов в UTF-8?

Приветствую, хабр!

Столкнулся с проблемой корректной работы функций изменений регистра символов при работе с русским текстом в кодировке UTF-8.

Вот функция, к которой я пришел. Она работает, но, имхо, выглядит крайне некрасиво:
function reverseStringCharactersCase($string)
{
    $reversedString = '';
    $string = iconv('UTF-8', 'cp1251', $string);
    
    for ($i = 0; $i < strlen($string); $i++) {
        if (isUpperCase($string[$i])) {
            $reversedString .= mb_strtolower($string[$i], 'cp1251');
        } else {
            $reversedString .= mb_strtoupper($string[$i], 'cp1251');
        }
    }

    return iconv('cp1251', 'UTF-8', $reversedString);
}



Что я пытался сделать, но не сработало:


1. Я попробовал использовать обычные функции обработки строк, а не из мультибайт библиотеки. Эти функции на русские строки вообще не реагировали, различные варианты использования setlocale() ни к чему не привели (ubuntu server 10.10).


2. Я пытался использовать mb_strtoupper с вторым аргументом 'utf-8', но и этот вариант не помог.


Я хочу добиться красивого кода, без использования multibyte функций и явного преобразования кодировки средствами iconv(). Прогу прощения, если вопрос нубский, надеюсь на помощь аудитории данного замечательного ИТ-ресурса.

Заранее спасибо!
  • Вопрос задан
  • 10096 просмотров
Решения вопроса 1
@edogs
1) Не важно как красиво выглядит простая функция, если она работает и универсальна — этого достаточно.
2) А локаль utf-8 у Вас установлена? И правильно ли Вы ее называете при установке setlocale: locale -a в консоли проверьте.
3) Если у Вас пхп как модуль апача, то читайте варнинг к php.net/setlocale, по поводу того, что соседние потоки того же процесса могут менять локаль и для Вас, т.к. при такой конфигурации локаль глобальна.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Я хочу добиться красивого кода, без использования multibyte функций и явного преобразования кодировки средствами iconv().
Фактически это означает, что вы хотите написать свой парсер utf-8 хотя бы для русского подмножества символов? :) Зачем?
Ответ написан
Как на счёт использования следующего класса: blog.ivru.net/?id=187

Примеры использования:
mystrto::lower("АБВГABCD"); результат: абвгabcd
mystrto::upper("абвгabcd"); результат: АБВГABCD.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы