Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Закрытая темаСоздание новой темыСоздание опроса

> setlocale и русский (utf8)
kirik  
 ۩  [x] Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Жадный квантификатор
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 6130
Пользователь №: 4795
На форуме: 8 лет, 11 месяцев, 15 дней
Карма: 118




Проблема заключается в следующем.
Имеем файл с содержанием
PHP
header('Content-type: text/html; charset="utf-8"');
setlocale(LC_ALL, 'ru_RU.UTF-8');
echo strtoupper('СоТонА');

На выходе получаем тоже что и на входе.

locale -a выдает
Цитата
kirik@kirik:~$ locale -a
C
en_CA.utf8
POSIX
ru_RU.cp1251
ru_RU.utf8


PHP
echo setlocale(LC_ALL, 'ru_RU.UTF-8');

- выдает ru_RU.UTF-8, что говорит о том что локаль установленна корректно.

При этом даты через strftime выводятся на нормальном русском языке.

PHP
echo mb_strtoupper('СоТонА', 'UTF-8');

- работает на "ура", вот только у меня уже везде используются обычные строковые функции.

На форуме нашел похожую тему, но последний вариант мне не подходит потому как в дальнейшем на сайте будет еще немецкий и польский языки.

Если кто сталкивался с подобной несправедливостью по отношению к русскому языку, буду рад узнать вариант решения данной траблы! smile.gif



Спустя 21 минута, 52 секунды (4.02.2009 - 00:59) twin написал(а):
Я сталкивался, так пока и не решил. Сделал выбор языка и несколько файлов с заменами и разными локалями. С многобайтной кодировкой вечно проблемы.

Спустя 5 минут, 4 секунды (4.02.2009 - 01:04) kirik написал(а):
twin, пока единственный рабочий вариант - использование mbstring модуля:

PHP
mb_internal_encoding('UTF-8'); // Устанавливаем кодировку строк
setlocale(LC_ALL'ru_RU.UTF-8'); // Устанавливаем нужную локаль (для дат, денег, запятых и пр.)

// Юзаем вместо обычных строчных функций mb_* (модуль mbstring)
echo mb_strtoupper('Hello World!').'<br />'// Для английского
echo mb_strtoupper('СоТоНа').'<br />'// Для русского
echo mb_strtoupper('Beiträge').'<br />'// Для немецкого
echo mb_strtoupper('Zmień wygląd'); // Для польского

Спустя 34 минуты, 9 секунд (4.02.2009 - 01:38) twin написал(а):
Я не поминю щас точно, но это был первый вариант и почему то не пошел... Завтра на свежую голову мож вспомню почему.

Спустя 9 часов, 35 минут, 46 секунд (4.02.2009 - 11:14) vasa_c написал(а):
Цитата
пока единственный рабочий вариант - использование mbstring модуля:

Ну, собственно, это единственно правильный вариант для UTF. Чем он не нравится?
MBString так же можно настроить, чтобы стандартные функции типа strtolower работали, как mb_*

Спустя 12 минут, 42 секунды (4.02.2009 - 11:27) twin написал(а):
Что то, если не изменяет память, у меня не клеилось с подсчетом символов с mb... Хотя может это была локальная проблема. Вообще то конечно, для того этот модуль и писан, чтобы с многобайтными работать.

Спустя 9 минут, 54 секунды (4.02.2009 - 11:37) kirik написал(а):
Цитата (vasa_c @ 4.02.2009 - 03:14)
Чем он не нравится?

Просто изначально использовал в движке обычные строковые функции, не думал что будет такая проблема.
Сейчас все заменил на mb_, проблем нет! smile.gif

Цитата (vasa_c @ 4.02.2009 - 03:14)
MBString так же можно настроить, чтобы стандартные функции типа strtolower работали, как mb_*

Спасибо за информацию! Только что почитал про перегрузку однобайтовых функций.. Зря сидел заменял все на mb_* huh.gif

Спустя 6 дней, 23 часа, 5 минут, 15 секунд (11.02.2009 - 10:42) kirik написал(а):
Итак в продолжении темы напишу немного про дружбу регулярок и русских букв в utf8.

Написал я форум, сделал все красиво, в юникоде smile.gif Потом думаю - "какой же форум без поиска?!" и прикрутил к нему поиск (тоже красивый - с подсветкой smile.gif ). Играл с ним 3 дня и 3 ночи, нарадоваться не мог, пока случайно не создал топик на русском. И одолела меня злость на эти мультибайтовые кодировки, - русские буквы отказывались подсвечиваться (точнее подсвечивались, но регистрозависимо), и начал я гром и молнии метать по всему гуглу в поисках вакцины от неверных. smile.gif

Первое что мне пришло в голову, - заглянуть на родной php.net. Там я прочитал, что mb_internal_encoding('UTF-8'); выставляется для текстовых функций. Надо сказать, что все обычные строковые функции я перезагрузил [по совету vasa_c] с помощью строчки php_value mbstring.func_overload "7" в .htaccess-е (Что значит 7-ка, можно прочитать тут). Но как оказалось мало установить кодировку символов, нужно установить кодировку самих регулярных выражений с помощью mb_regex_encoding('UTF-8');. Все бы хорошо, но вот отказывалась eregi_replace() работать регистронезависимо. И с модификаторами и без - никак. Я уже подумывал на это дело забить, но что-то меня потянуло к гуглу опять. И нарыл я инфу, что PCRE и без всяких перезагрузок работают с НЕлатиницей! Нужно всего-навсего добавить модификатор u. Тоесть регулярка получится примерно такой -
PHP
preg_replace('#(тут че-то)#iu');


Может кому пригодится сей рассказ rolleyes.gif
Надеюсь моя эпопея с русскими буквами на этом закончится cool.gif

Спустя 4 часа, 22 минуты, 45 секунд (11.02.2009 - 15:05) Sylex написал(а):
kirik
тоже когда-то сталкивался с подобным smile.gif
PMСайт пользователя
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Закрытая темаСоздание новой темыСоздание опроса