Проблемы с русскими буквами в админке

Обсуждение CMS Made Simple в России.

Moderators: iturbay, wdwp

WiseTroll
Forum Members
Forum Members
Posts: 13
Joined: Sun Jan 27, 2008 11:02 am

Проблемы с русскими буквами в админке

Post by WiseTroll »

Проблема заключается в том, что некоторые русские буквы в админке меняются на знаки вопросов в чёрных ромбиках.
Например в меню горит не Контент, а ?онтент, не Редактировать, а ?едактировать.
Причём, похоже такое происходит только с первыми буквами в словах. Думал, что криво залился файл с русским переводом, но всё оказалось в порядке.
Где искать ошибку не пойму.

Заранее спасибо :)
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблемы с русскими буквами в админке

Post by ZYV »

Надо mbstring включить в настройках php как я догадываюсь...
unsigned double ZYV;
ve2
Forum Members
Forum Members
Posts: 11
Joined: Wed Feb 20, 2008 8:55 am

Re: Проблемы с русскими буквами в админке

Post by ve2 »

У меня аналогичная проблема. Расскажу более подробно.
Ставил CMSMS 1.2.3 на Apache/2.0.59 (FreeBSD) PHP/5.2.1 with Suhosin-Patch. Все кодировки utf-8.
В администраторском интерфейсе некоторые заглавные русские буквы в словах хранящихся не в базе, а в файлах (например буква "К" в слове "Контент" из переменной $lang['admin']['content'] файла /admin/lang/ext/ru_RU/admin.inc.php)
отображается неправильно. В FF буква "К" выглядит как черный ромб с вопросительным знаком внутри с пробелом после нее. В IE - буквально "Цnbsp;онтент". Если сохранить страницы на диск в каждом из браузеров слово "Контент" (смотрим сохраненные файлы в кодировке 1251) выглядят так: IE  "Р│nbsp;Р_Р_С'РчР_С'" и FF "пї_ Р_Р_С'РчР_С'".

Модуль mbstring и подключал и отключал, не помогло. Если требуется какая-то специальная настройка поделитесь пожалуйста!

Самое удивительное, что ставил на Windows, там русские буквы без проблем. Настраивал все вроде-бы аналогично.
ve2
Forum Members
Forum Members
Posts: 11
Joined: Wed Feb 20, 2008 8:55 am

Re: Проблемы с русскими буквами в админке

Post by ve2 »

Проблема с буквами меню возникает в методе FixSpaces (class.admintheme.inc.php)
который состоит всего из одной функции
return preg_replace('/\s+/'," ",$str)
Вот функция preg_replace и портит некоторые буквы русского текста в UTF-8, видимо ошибочно считая их пробельными символами. Следующий пример покажет суть проблемы на тех платформах, где она проявляется.

$test = 'Контент'; // текст должен быть в utf-8
echo $test . "" .
    preg_replace('/\s+/'," ", $test) . "" .
    ereg_replace('/\s+/'," ", $test) . "";

Функция ereg_replace этим не страдает. Осталось только понять что не так с preg_replace. Поскольку это не единственное место ее использования и вероятно она может портить много если ее не починить.

Если кто знает как, подскажите!
ve2
Forum Members
Forum Members
Posts: 11
Joined: Wed Feb 20, 2008 8:55 am

Re: Проблемы с русскими буквами в админке

Post by ve2 »

Похоже CMSMS (1.2.3) просто содержит ошибку, которая будет проявляется  в некоторых сочетаниях платформы, pcre и php. Из 3 проверенных  на одном проявилось. Но по смыслу, если в региональных настройках заявлена кодировка utf-8 разработчики были обязаны использовать модификатор регулярных выражений /u указывающий на использование utf-8. Иначе получаем все указанные выше симптомы с проглатыванием части букв и не только.

То есть, видимо, правильно: preg_replace('/\s+/u'," ", $str)

Цитата с  http://www.php.net/manual/en/reference. ... ifiers.php

u (PCRE_UTF8)
    This modifier turns on additional functionality of PCRE that is incompatible with Perl. Pattern strings are treated as UTF-8. This modifier is available from PHP 4.1.0 or greater on Unix and from PHP 4.2.3 on win32. UTF-8 validity of the pattern is checked since PHP 4.3.5.

Кто-нибудь возразит? Или надо разработчикам писать?
ve2
Forum Members
Forum Members
Posts: 11
Joined: Wed Feb 20, 2008 8:55 am

Re: Проблемы с русскими буквами в админке

Post by ve2 »

Беру свои слова назад. Ошибок нет.
в config.php следует указать
$config['locale'] = 'ru_RU.UTF-8';
так как у меня на FreeBSD системная локаль ru_RU.koi8-r, а если в config не указано явно, то используется системная.
похоже, тема закрыта.
WiseTroll
Forum Members
Forum Members
Posts: 13
Joined: Sun Jan 27, 2008 11:02 am

Re: Проблемы с русскими буквами в админке

Post by WiseTroll »

ve2 wrote: $config['locale'] = 'ru_RU.UTF-8';
Да, действительно, это решило проблему и на Linux. Всем спасибо.  ;)
WiseTroll
Forum Members
Forum Members
Posts: 13
Joined: Sun Jan 27, 2008 11:02 am

Re: Проблемы с русскими буквами в админке

Post by WiseTroll »

Интересно, что установка $config['local'] никак не помогла на моей локальной Windows-машине. А вот использование preg_replace('/\s+/u'," ", $str) в FixSpaces() всё исправило. Надо это что ли в багах опубликовать.
ve2
Forum Members
Forum Members
Posts: 11
Joined: Wed Feb 20, 2008 8:55 am

Re: Проблемы с русскими буквами в админке

Post by ve2 »

А слово "Выход" в меню и на главной странице после установки локали тоже правильно отображается?
ve2
Forum Members
Forum Members
Posts: 11
Joined: Wed Feb 20, 2008 8:55 am

Re: Проблемы с русскими буквами в админке

Post by ve2 »

И все-таки модификатор /u для pcre выражений необходим. Его отсутствие в preg_replace при работе с utf-8 это баг разработчиков. Некоторые русские буквосочетания даже при правильно установленной локали портятся без его указания. У меня это буква ы в слове "Выход". Тестовый пример на чистом php:

setlocale(LC_ALL, "ru_RU.UTF-8");
$test = 'Выход Контент'; // текст должен быть в UTF-8
echo $test . "" .
    preg_replace('/\s+/',"-", $test) . "" .
    preg_replace('/\s+/u',"-", $test) . "";

Без /u портится или первое или второе слово при наличии или отсутствии setlocale.
Причем просто так по всем исходникам /u не расставишь, это должно зависеть от выбранного языка.

Замечу, что у меня все это проявилось только на FreeBSD с pcre-6.7. На Linux с pcre-4.5-3.2.RHEL4 (кстати системная локаль там koi-8) и Windows все выглядит нормально.

В общем, тут требуется комментарий разработчиков.
Last edited by ve2 on Thu Feb 21, 2008 1:18 pm, edited 1 time in total.
WiseTroll
Forum Members
Forum Members
Posts: 13
Joined: Sun Jan 27, 2008 11:02 am

Re: Проблемы с русскими буквами в админке

Post by WiseTroll »

ve2 wrote: А слово "Выход" в меню и на главной странице после установки локали тоже правильно отображается?
Да, под линухом всё правильно стало. А винде только добавление /u помогло.
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблемы с русскими буквами в админке

Post by ZYV »

I suspect we've found a bug in cmsms (I mean Russian forum users).
* Disconnected (Connection reset by peer).
* zaytsev already in use. Retrying with zaytsev_...
* Now talking on #cms
* Topic for #cms is: Meeting attendees: Please join the cmsms-dev mailing list || Official Channel for CMS Made Simple || http://cmsmadesimple.org || Current Version: 1.2.3 || Don't spam, use the pastebin! http://cmsmadesimple.org/pastebin. Password: simple
* Topic for #cms set by Ted at Tue Jan 29 22:29:47 2008
* #cms :[freenode-info] channel trolls and no channel staff around to help? please check with freenode support: http://freenode.net/faq.shtml#gettinghelp
* efix (n=frank@fxchains.fttp.xmission.com) has joined #cms
* efix (n=frank@fxchains.fttp.xmission.com) has left #cms
It turns out that you use a log of preg_replace here and there, and you usually omit the "u" modifier which is required by PCRE if the string is in UTF-8.
That does not cause any harm for latin-based languages, however preg_replace when used with unicode strings without the u modifier tends to currupt some national characters like "К" in Russian.
http://forum.cmsmadesimple.org/index.ph ... 903.0.html - link to the discussion
Title: CMS Made Simple Forum: (at forum.cmsmadesimple.org)
calguy1000 got the email thanks :)
* sportman is having girl issues again
:(
zaytsev_: here and there? quick grep finds 555 lines :/
sportman: join the club
The funny thing is that it depends on the locale settings
And PCRE & PHP versions
why I'm not suprised
* sportman decided that his girl friend dries him so crazy
* sportman needs to figure out how to break up with her, but friday is her birthday
:/
Sometimes, if the correct locale is set it works. Sometimes it does not work even with the correct locale settings (ru_RU.UTF-8). That's why the problem was unnoticed for a long time.
we have a saying "älä sano pahasti, sano hyvästi" rough translation "dont say anything bad, just say goodbye"
works better in finnish
(on Windows, it does not work with UTF-8 without the /u modifier at all because there the locale stuff does not work the same way)
sportman, I'm fed up with girls... welcome to the club
windows doesnt work
sportman, I like Perl and Python scripts. They are more predictable and less ressource hungry.
lol zaytsev
i like that one
tsw, anyway I think it's a problem and it should be taken care of.
* fransman has quit ("Leaving.")
In short: if the current encoding is UTF-8, one must use /u and it will work no matter which version of PCRE is being used and what's the locale settings. If it's anything else, one shouldn't use /u at all.
By the way, it seems like ereg_replace doesn't have such problems at all.
tsw what are u fighting with your girl over again?
So a possible solution is to replace it with ereg's but I am not sure about the performance impact. And maybe sometimes some PCRE-specific features were used.
Maybe I should file a bug or something. It's really important for everybody not using latin-based alphabet.
The guys who discovered this are waiting for devs to reply. But I'm quite sure you wont be replying them in Russian so welll I'm just trying to be helpful.
unsigned double ZYV;
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблемы с русскими буквами в админке

Post by ZYV »

zaytsev_: can you create a minimal test case?
New paste by ZYV at: http://cmsmadesimple.org/pastebin/1634
http://cmsmadesimple.org/pastebin/1634
Title: PHP pastebin - collaborative debugging tool (at cmsmadesimple.org)
The second or third words get corrupted (the second if the locale is not UTF-8  and the third if or string in single-byte enconding like windows-1251 or koi8-r)
The words in $test are taken from the CMSMS translation (Exit and Content)
It's important to save this file are UTF-8.
hmh, I cant replicate on php 4.3.9 and 5.2.0
on linux
dont have any windows servers available
The guy who found this was using FreeBSD & pcre-6.7. I am going to try to replicate this on my side.
I have seen this on some of my hosts but I don't rememeber exactly which ones because I didnt pay the attention to it.
hmm, I wonder how the debian notation goes on this
ii  libpcre3                        6.7+7.4-3
does that mean 6.7 with backports from 7.4
anyways that is the latest (I remeber seeing a bug in pcre few weeks ago and ofcourse updated)
Hhmm... The host I've seen this on was one on the following: Dathorn, Majordomo or Masterhost.  I will need to check them all.
OK I will report back then, that in order to reproduce it we need the complete info about the system.
unsigned double ZYV;
ZYV
Language Partners
Language Partners
Posts: 868
Joined: Tue Nov 15, 2005 9:08 pm

Re: Проблемы с русскими буквами в админке

Post by ZYV »

Вывод: не можем воспроизвести.
[zyv@pride ~]$ uname -a
Linux pride 2.6.18-53.1.13.el5 #1 SMP Tue Feb 12 13:01:45 EST 2008 i686 athlon i386 GNU/Linux
[zyv@pride ~]$ php -v
PHP 5.1.6 (cli) (built: Sep 20 2007 10:16:10)
Copyright (c) 1997-2006 The PHP Group
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
[zyv@pride ~]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
[zyv@pride ~]$ rpm -q pcre
pcre-6.6-2.el5_1.7
[zyv@pride ~]$ rpm -q mysql
mysql-5.0.22-2.2.el5_1.1
mySQL в UTF-8. Всё ОК. Пишите свою инфу.
Last edited by ZYV on Sat Feb 23, 2008 10:24 pm, edited 1 time in total.
unsigned double ZYV;
ve2
Forum Members
Forum Members
Posts: 11
Joined: Wed Feb 20, 2008 8:55 am

Re: Проблемы с русскими буквами в админке

Post by ve2 »

$ uname -a
FreeBSD ****.ru 6.2-RELEASE FreeBSD 6.2-RELEASE #1: Tue Oct 30 12:33:29 MSK 2007

$ php --version
PHP 5.2.1 with Suhosin-Patch 0.9.6.2 (cli) (built: Feb 13 2008 14:36:49)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

$ pkg_info | grep pcre
pcre-6.7            Perl Compatible Regular Expressions library
php5-pcre-5.2.1_5  The pcre shared extension for php

$ pkg_info | grep mysql
mysql-client-5.0.27 Multithreaded SQL database (client)
mysql-server-5.0.27 Multithreaded SQL database (server)
php5-mysql-5.2.1_3  The mysql shared extension for php
php5-mysqli-5.2.1_3 The mysqli shared extension for php

$ locale
LANG=ru_RU.KOI8-R
LC_CTYPE="ru_RU.KOI8-R"
LC_COLLATE="ru_RU.KOI8-R"
LC_TIME="ru_RU.KOI8-R"
LC_NUMERIC="ru_RU.KOI8-R"
LC_MONETARY="ru_RU.KOI8-R"
LC_MESSAGES="ru_RU.KOI8-R"
LC_ALL=

$  cat /usr/local/etc/my.cnf
[mysqld]
character_set_server = utf8
init-connect = "set names utf8"

[cmsmadesimple]$ cat config.php | grep locale
$config['locale'] = 'ru_RU.UTF-8';

В этом окружении проблема присутствует.

Как мне кажется, конкретное сочетание софта не главное, хотя желание смоделировать ситуацию понятно.
Дело в принципе. Еще раз обращаю внимание на документацию по php
http://www.php.net/manual/en/reference. ... ifiers.php
Если я правильно понимаю замечание относительно /u, это означает что без него образец вообще не рассматривается как строка UTF-8. Поэтому без него и _должно_  работать неправильно! Случайность то, что работает.
Post Reply

Return to “Russian - русский”