Эта тема на forum.dklab.ru


Aragorn: Проблема с ereg_replace
Привет всем!
Проблема такая: я работаю над cms системой на php+sql с поддержкой многоязыкового интерфейса как админки, так и самого сайта.
Рассмотрим 2 случая добавления новости.
В первом случае модератор добавляет новость в русском интерфейсе админки - кодировка windows-1251,
а во втором - в румынском - windows-1250. При этом, значение одного и того же поля на русском, переданного через форму в
разных интерфейсах будет разным. В первом случае это обычный русский текст, а во втором - закодированный в html символы (из-за кодировки windows-1250).
Чтобы это устранить я написал функцию декодирования и кодирования. В ф-ции кодирования и начались проблемы. Вот приблизительный пример моего кода:

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
<?php
include("languages/rus/code.php");
include("languages/rom/code.php");

$values['rus']="Текст по русскому языку - ооо Эпнер";
$values['rom']="Текст по русскому языку - ооо Эпнер - Romana + гоєю"; /* В данной строке могут присутствовать как русские,
так и румынские символы, причем 'гоєю' - это буквы ăîşţ - при сохранении данного файла они превратились в эти 'закорючки'
*/

print_r($values);
echo "<br><br><br>";

$lang_massive=array("rus","rom");

function decode_one_lang ($values) {

global $encoding_mas;
global $lang_massive;

foreach($lang_massive as $current_lang) {
if (!empty($encoding_mas[$current_lang]) AND $current_lang!='rus') {
// Данная версия языка является исключением для поля
// Осуществляем процесс кодирования
foreach($encoding_mas[$current_lang] as $cod=>$symbol) {
$values[$current_lang]=ereg_replace($symbol, $cod, $values[$current_lang]);
};
};
};
return $values;
};

$values=decode_one_lang ($values);
print_r($values);
?>
</body>
</html>


На выходе сдедующее:

<html>
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>
Array
(
[rus] => Текст по русскому языку - ооо Эпнер
[rom] => Текст по русскому языку - ооо Эпнер - Romana + гоєю
)
<br><br><br>Array
(
[rus] => Текст по русскому языку - ооо Эпнер
[rom] => Текст п&#238; русск&#238;му языку - &#238;&#238;&#238; Эпнер - Romana + &#259;&#238;&#351;&#355;
)
</body>
</html>


Почему-то ereg_replace кроме замены румынских символы ă,î,ş,ţ на соответствующие им коды осуществляет и замену таких русский букв
как о, ю, г. Такое ощущение, что он считает, что данные русские буквы являются румынскими символами.
Протяните руку помощи, плиз, а то мозги уже закипают.
Заранее спасибо.
WingedFox:
Aragorn
Потому что надо использовать UTF-8 и не мучать бабушку.
Win-кодировки используют только 255 символов, т.ч. неизбежно пересечение кодов.
Aragorn:
В UTF-8 все работает. В очередной раз спасибо!

Вот только у меня все сообщения в админке и вся БД на кодировках windows-1251 и 1250.
И если просто изменить кодировку страницы на utf-8, то вся текстовая инфа превращается в
нечто подобное:
'#孲�� ﰮ䠦଼'

Можно ли это как-то исправить без того, чтобы заново вводить всю информацию в БД?


P.S. Убил бы того, кто придумал кодировки
Maus:
Aragorn
echo iconv("UTF-8", "ISO-8859-1", "This is a test.");
?
WingedFox:
Aragorn
1. Кто мешает написать скрипт, для конвертации данных?
2. просто смените кодировку скриптов на utf-8, и отдавайте utf-8 в encoding.
Миша Спларов:
Вот только у меня все сообщения в админке и вся БД на кодировках windows-1251 и 1250.
Переконвертируйте базу в UTF-8, и сообщения админки также.
WingedFox:
Миша Спларов
Совет хороший, но проблема - не моя 8*)
Aragorn:
Файлы я переконвертировал в utf, однако теперь появилась проблема с хранением данных.
Я для теста создал новую БД с кодировкой utf8_general_ci, а также необходимые таблицы.
Выполяю через веб-интерфейс своей cms запрос:

INSERT INTO phone_records (id, category, post_rus, post_rom, name_rus, name_rom, phone_i, phone_e, phone_m, email, hide, datestamp ) VALUES('1150370457', '1150369938', 'шщэжзхъюбьяйфцукенгырва', 'шщэжзхъюбьяйфцукенгырва', 'шщэжзхъюбьяйфцукенгырва', 'шщэжзхъюбьяйфцукенгырва', '', '', '', '', 'show', '1150322400')

Запрос проходит успешно, но при просмотре данных все буквы 'ш' превращаются в кучу квадратов.
Явная проблема с кодировкой, может для данных установить другую кодировку?
WingedFox:
Aragorn
в UTF-8 должно быть все:
и БД, и текстовые поля, и - самое главное - соединение с базой и кодировка результата выборки
Aragorn:
А каким образом задать кодировку результатов выборки и соединения с бд?
Почитал ман ф-ции mysql_select_db - там ни слова о кодировки соединения.
WingedFox:
http://forum.dklab.ru/viewtopic.php?p=110117#110117
и ниже
Aragorn:
Поставил:

mysql_query("SET character_set_client = 'utf8';");
mysql_query("SET character_set_results = 'utf8';");
mysql_query("SET character_set_connection = 'utf8';");


и все заработало корректно!

WingedFox
Большое спасибо!
WingedFox:
Aragorn
Большое пожалуйста 8*)
Миша Спларов:
Совет хороший, но проблема - не моя 8*)
Ага, извинияюсь :-)

Поставил
Достаточно лишь:
SET NAMES 'utf8'
WingedFox:
SET NAMES 'utf8'
К сожалению - этого совсем не всегда достаточно.
Миша Спларов:
К сожалению - этого совсем не всегда достаточно.
Читайте документацию, пожалуйста: http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html
Aragorn:
Не совсем по теме, но все же.
В php my admin обнаружил следующий глюк:

есть запись в таблице -
Метеорологическое обеспечение гражданской аэронавигации //Издание 01 Июнь 2000//



При просмотре содержимого таблицы php my admin урезает данную запись, подставляя в конце '...'
Но во многих случаях в конце появляется буква 'Ю' или квадраты:
Метеорологическое обеспечЮ..

Дело в том, что в админки моей cms наблюдается сходная проблема.
Если у кого-нибудь есть идея, как это исправить, то подскажите пожалуйста.
WingedFox:
Миша Спларов
Я не знаю - были это кривые настройки базы на хостинге, или бага в самой базе, но после чтения документации я угробил около суток на поиск решения.

Aragorn
Скорее всего, Вы используете обычные строковые функции для нарезки строки. Они не знают про UTF. Используйте mbstrings и обратите внимание на параметр func_overload.
Aragorn:
Пробежал по ссылке и понял, что возни там много, а свободного времени у меня пока нет. Как будет время, попробую внедрить.
Aragorn:
WingedFox
Сегодня основательно почитал стаью. Настроил php.ini как там сказано, однако при указании в моем php скрипте функции mb_substr
выдается ошибка:
Fatal error: Call to undefined function mb_substr() in w:\home\airmoldova.int\www\modules\news\admin\news_list.php on line 38

Как я понимаю, нужно установить расширение extension=php_mbstring.dll, не входящее в базовый пакет денвера.
Будьте добры, подскажите где у вас его взять.
WingedFox:
Например здесь:
http://kromann.info/download.php?strFolder=php4-Release_TS&strIndex=PHP4

PS: внимательно прочитайте раздел "Function overloading".
Anonymous:
WingedFox
За ссылку спасибо, однако есть проблема:
кинул скаченный файл usr\local\php5\ext в директорию C:\WebServers\usr\local\php5\ext - выдаются ошибки при старте сервера -
-не найдена динамическая ссылка на php4ts.php
-не может найти библиотеку usr/local/php5/ext\usr\local\php5\ext
Aragorn:
Пардон, забыл залогиниться.
Кстати система - win2000
WingedFox:
Aragorn
Так я дал ссылку на php4 :)

http://kromann.info/php.php
Anonymous:
Почитал я эту ссылку, однако проблему это не решило.
Я же говорил, что при старте прога ругается на php4ts.php
В папке C:\WebServers\usr\local\php5 есть файл php5ts.php, а файла php4ts.php нет.
Может это проблема связана с версиями php? По крайней мере никаких настроек по php4ts.php в php.ini я не обнаружил.
Простое переименование файла на php4ts.php проблему не решает.

Объясните, пожалуйста, подетальнее, как эту проблему решить.
WingedFox:
Скачайте библиотеку для нужной версии PHP
Если у Вас PHP4 - качайте php_mbstring.dll из сборки PHP4. Если PHP5 - из сборки PHP5.
Maus:

Как я понимаю, нужно установить расширение extension=php_mbstring.dll, не входящее в базовый пакет денвера.
Будьте добры, подскажите где у вас его взять.

практически все файлы, не входящие в базовый пакет, вынесены в отдельные пакеты расширения. Только 4.4.2 не берите ( http://forum.dklab.ru/viewtopic.php?t=21256&postdays=0&postorder=asc&highlight= )
Anonymous:
WingedFox
У меня стоит пхп весии 5.0.2, причем поиск в гугле типа:
download php_mbstring.dll php5.0.2
ни к чему не приводит
Пробовал ставить php_mbstring.dll для пхп4 - результат аналогичный.

Может поменять версию пхп?
WingedFox:
Aragorn
Может быть стоит внимательнее просматривать сайты, на которые дают ссылки?
Там есть dll для всех версий PHP
Anonymous:
Aragorn
Может быть стоит внимательнее просматривать сайты, на которые дают ссылки?
Там есть dll для всех версий PHP

Указанный Вами сайт находится на этапе создания - поиск отсутствует
Ctrl+F по 5.0.2 на странице http://kromann.info/php.php ничего не дает
Ссылка http://kromann.info/download.php?strFolder=php5_0_2-Release_TS&strIndex=PHP5_0_2 ведет в пустату.

Так как же можно еще внимательнее просмотреть страницу?
Maus:
Aragorn
Вам 5 Мб жалко? (учитывая, что нужная библиотека весит почти треть от этого ). Если не жалко -качайте пакет расширения к Денверу и закроем этот вопрос.
Aragorn:
Maus
Мне не жалко даже 25 метров.
Если не трудно, дайте ссылку, где можно скачать и денвер и пакет расширений сразу.
Aragorn:
Сегодня снес денвер, который работал на пхп5.
Установил базовый пакет денвера под пхп 4.4.0
Скачал расширения php_mbstring.dll (4.4.0) и кинул ее в F:\WebServers\usr\local\php\extensions
В php.ini установил extension=php_mbstring.dll

Вроде все правильно сделал, но сервак при старте все равно ругается 2 раза:

1. The procedure entry point php_escape_shell_cmd could not be located in the dunamic link library php4ts.dll
2. Unknown(): Unable to load dynamic library '/usr/local/php/extensions\php_mbstring.dll' - The specified procedure could not be found.

Помогите пожалуйста!
Aragorn:
Вижу никто не отвечает, ну да ладно, проблему решил сам.
Решение:
1. Ставим базовую версию денвера Base_PHP5_2006-04-25_a1.3.31_p5.1.2_m4.1.16_pma2.6.1.exe
2. Подкидываем в директорию C:\WebServers\usr\local\php5\ext необходимые биюлиотеки версии 5.1.2
3. Прописываем их в php.ini

И все работает

P.S. Видимо в версии php 5.0.2, которая стояла у меня был баг.



Вопрос решен, тему можно закрыть.
Maus:
Aragorn
Все базовые пакеты и пакеты расширения доступны при переходе с http://denwer.ru по ссылке "скачать дистрибутивы".
Maus:
Тема закрыта.

Эта тема на forum.dklab.ru