Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Мультиязычный сайт - php + unicode
 
 автор: Евгений Петров   (30.12.2006 в 22:08)   письмо автору
 
 

С наступающим вас новым годом ув. форумчане!

Снова вынужден просить вашей помощи в нашем нелегком деле. Надеюсь моя проблемма не останется без внимания и будет интересна и вам тоже.
Суть в следующем. Разрабатывается сайт. Будет один главный домен и много локальных субдоменов для разных стран. Соотв. локальные домены будут на разных языках, которые так прямо и кишат всякими там символами которые мне даже произносить страшно. Делать нечего, решил работать с юникодом. Да вот проблемма на сервере не установлен модуль mbstring. Хотя и с ним ситуация особо не спасается... Допустим выбираю из базы (таблицы в юникоде) какую то строку и echo mb_strtoupper() выводит какую то чушь. Символы мало того что не преобразовываются к верхнему регистру, часть их ещё и искажается.
Может кто нибудь знает какие нибудь статьи про то как работать с юникодом в пхп (5-я версия). ли поделится своим опытом. Буду очень признателен.

   
 
 автор: cheops   (30.12.2006 в 22:19)   письмо автору
 
   для: Евгений Петров   (30.12.2006 в 22:08)
 

У вас какая кодировка (и сортировка) таблиц в СУБД MySQL?

   
 
 автор: Евгений Петров   (30.12.2006 в 22:41)   письмо автору
 
   для: cheops   (30.12.2006 в 22:19)
 

В MySQL utf8 но не в ней проблемма, т.е. что то типа:
echo mysql_result(mysql_query("SELECT `f1` FROM tbl"),0,0); выводить все правильно. А вот если преобразовать к верхнему регистру то искажается

   
 
 автор: Евгений Петров   (30.12.2006 в 22:46)   письмо автору
 
   для: Евгений Петров   (30.12.2006 в 22:41)
 

О! А если указать кодировку во втором параметре mb_strtoupper то преобразовывает нормально. Но ситуация не решается. mbstring не установлен. Спрошу у заказчика, возможно удасться уговорить хостеров включить, но не уверен что они согласятся. Может есть какие нибудь другие функции работающие с юникодом? Или какие то реализованные функции...

   
 
 автор: Unkind   (30.12.2006 в 22:56)   письмо автору
 
   для: Евгений Петров   (30.12.2006 в 22:46)
 

Вообще лучше перевести на время в windows-1251 с помощью iconv(), например. Либо можете менять регистр букв в UTF-8 с помощью strtr():


<?php
$string 
"ааа";
$array = array('А' => 'а''Б' => 'б''В' => 'в'); //И т.д.
$string strtr($string$array);
?>

   
 
 автор: Евгений Петров   (30.12.2006 в 23:03)   письмо автору
 
   для: Unkind   (30.12.2006 в 22:56)
 

Было бы конечно лучше, но в cp1251 есть не все символы. Сайт будет не только на русском и английском языках. Точно знаю что бцдет польская версия. А у них там есть символы с хвостиками с какими то :) Их в cp1251 нет, поэтому при перекодировке они потеряются.

   
 
 автор: Unkind   (30.12.2006 в 23:22)   письмо автору
 
   для: Евгений Петров   (30.12.2006 в 23:03)
 

ааа. Ну тогда "символы с хвостиками" тоже можно таким же образом переводить, через strtr().

   
 
 автор: Евгений Петров   (30.12.2006 в 23:38)   письмо автору
 
   для: Unkind   (30.12.2006 в 23:22)
 

Да нет, это только усложнит проблемму. Все такие символы вбить - с ума можно сойти, да и обработка их создаст лишнюю нагрузку.

   
 
 автор: Unkind   (31.12.2006 в 00:44)   письмо автору
 
   для: Евгений Петров   (30.12.2006 в 23:38)
 

Ну...Можно попробовать типа такого:


<?php
function unicode_to_upper($letter)
{
    if((
ord($letter) >= 192) && (ord($letter) <= 223))
    {
    
$hexvalue dechex(ord($letter) + 848 32);
    if(
$letter == "Ё"$hexvalue "451";
    return 
"&#x0".$hexvalue.";";
    }
    else
    {
    return 
$letter;
    }
}

$string "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯ";
$unicode "";

for(
$i 0$i strlen($string); $i++)
{
$unicode .= unicode_to_upper($string[$i]);
}

echo(
$unicode);
?>


Только надо будет знать диапозоны таких буковок. Я, например, для Windows-1251 нашел (от 192 до 223 заглавные, 224 до 255 прописные), для других языков будет по-другому...

   
 
 автор: Евгений Петров   (31.12.2006 в 01:03)   письмо автору
 
   для: Unkind   (31.12.2006 в 00:44)
 

Понимаете, проблемма не в том, чтобы к верхнему регистру привести строку. Нужен полный пакет для работы со строками в юникоде. Все строковые функции, регулярные выражение и т.д. и т.п.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования