Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > русские слова в url


Автор: Rusjonny 1.1.2006, 23:54
smile топик убрал,помощь ниже,спасибо korob2001 дельный совет!

Автор: frenkys 2.1.2006, 00:28
А ты не пробывал названия хранть в мускульной базе и каждому названию присвоить ID и по єтому ID отображать все

Автор: Rusjonny 2.1.2006, 00:33
я бы с удовольствием,пока знаний не хватает,мне самому не осилить написать :-)
тут литературки накачал,изучаю....

Автор: korob2001 2.1.2006, 05:26
Цитата

Как сделать,что бы все набранное через вэб интерфейс, пользователями, перекодировать в латинские символы, а при обращении к странички или файлам, вернуть русские названия?

А зачем тебе это нужно? Воспользуйся возможностями XML, работать будет на порядок быстрее (даже если заюзать базу), да и всегда можно будет добавить поддержку других языков, если это будет нужно. smile
Например:
Код

<?xml version="1.0" encoding="utf-8"?>
<photobook-document version="1.0" timestamp="2006-01-01 3:17:00">
        <book id="23355236626165465223">
                 <ru>
                        <title>Новый год 2006</title>
                        <description>Это тестовый фотоальбом. Создан только для теста.</description>
                 </ru>
                 <en>
                        <title>New year 2006</title>
                        <description>This is a test photo album. Created only for test</description>
                 </en>
       </book>
       <book id="23355236626165465224">
                 <ru>
                        <title>Старый год 2005</title>
                        <description>Это второй тестовый фотоальбом. Создан только для теста.</description>
                 </ru>
                 <en>
                        <title>The old year 2005</title>
                        <description>This is a second test photo album. Created only for test</description>
                 </en>
       </book>
       <book id="23355236626165465225">
                 <ru>
                        <title>Италия 2003 год</title>
                        <description>Это третий тестовый фотоальбом. Создан только для теста.</description>
                 </ru>
                 <en>
                        <title>Italy 2003</title>
                        <description>This is a third test photo album. Created only for test</description>
                 </en>
       </book>   
</photobook-document>

Сохраним это дело в файл с именем PhotoBook.xml, в кодировке UTF-8
Теперь пишем такую CGI программу:
Код

#!/usr/bin/perl -w
use strict;
use XML::Simple;
use Text::Iconv;
use CGI;

# Путь к XML файлу
my $file = "/home/localhost/www/xmls/PhotoBook.xml";

# Создаём объекты CGI и Text::Iconv
my $conv = Text::Iconv->new("UTF-8", "WINDOWS-1251");
my $cgi  = CGI->new();

# Получаем данные из XML файла
my $xml = XMLin($file);

# Получаем параметры
my $lang = $cgi->param('lang') || "ru";
$lang = "ru" if ($lang ne "en");
my $id   = $cgi->param('id') || "";
$id = "" unless ( exists( %$xml->{book}{$id} ) );

 # Здесь разумнее воспользоваться XML, но для того, что бы его не перегружать,
 # что-бы проще было объяснить, я воспользовался обычными скалярными переменными.
 my($t1, $t2, $t3, $t4, $t5);
 if ( $lang eq "ru" ) {
      $t1 = "Название альбома";
      $t2 = "Описание альбома";
      $t3 = "Все альбомы";
      $t4 = "Английская версия";
      $t5 = "Всего альбомов";
 } else {
      $t1 = "Title of album";
      $t2 = "Description of album";
      $t3 = "All albums";
      $t4 = "Russian version";
      $t5 = "Total albums";
 }

# Выводим заголовок с нужно кодировкой, в зависимости от языка
print $lang eq "ru" ? $cgi->header( -charset => "windows-1251" ) : $cgi->header();

# Показываем информацию об альбоме, если указан реальный id
if ( $id ) {
     print $cgi->start_html( -title => "Album '" . $conv->convert($xml->{book}{$id}{$lang}{title}) . "'");
     print $cgi->b( $t1 . ": ");
     print $cgi->font( $conv->convert($xml->{book}{$id}{$lang}{title}) );
     print $cgi->br();
     print $cgi->b( $t2 . ": ");
     print $cgi->font( $conv->convert($xml->{book}{$id}{$lang}{description}) );
     print $cgi->hr();
     print $cgi->b( $t3 . ": ");
}

print $cgi->br();

# Переменная счётчик
my $count = 0;

# Выводим ссылки на все имеющиеся альбомы
foreach my $book ( keys %{$xml->{book}} ) {
    print $cgi->a( { -href => $cgi->url( -relative => 1 ) . "?id=$book&lang=$lang",
                     -style => "color: #0000aa" }, $conv->convert($xml->{book}{$book}{$lang}{title}));
    print $cgi->br();
    ++$count;
}

print $cgi->hr();

# Выводим общее число альбомов
print $cgi->b( $t5 . ": ");
print $cgi->font( $count );
print $cgi->hr();

# Делаем инверсию языка
if ( $lang eq "ru" ) {
     $lang = "en";
} else {
     $lang = "ru";
}

# Выводим ссылку на версию страницы на другом языке
print $cgi->a( { -href => $cgi->url( -relative => 1 ) . "?id=$id&lang=$lang",
                 -style => "color: #aa0000" }, $t4 );

# Завершаем генерацию HTML файла
print $cgi->end_html();

Теперь запускай CGI программу и наблюдай, сколько возможностей нам даёт простенький XML. Также обрати внимание, что если понадобится поддержка ещё одного или нескольких языков, то достаточно просто добавить ещё один или несколько блоков <сокращение-языка></сокращение-языка>, в блок <book></book>, нашего xml и немного подправить программу, так как я жёстко запрограммировал её на 2 языка. С другой стороны можно было бы создать список из всех возможных языков и при добавлении нового языка, заносить в него новый язык, всё остальное программа будет делать за тебя (вобщем гибко запрограммировать). Но это уже тонкости, если тебе будет нужно, то думаю ты разберёшься с этим. К тому же никогда не поздно задать конкретный вопрос в этом же разделе.

Так же прошу обратить внимание на то, что я, для простоты изложения в блоках <ru></ru><en></en> я храню только данные Заголовка и Описания. В них можно добавить так же и другие данные, если они нужны.

Удачи тебе и С новым годом. smile

Автор: Rusjonny 2.1.2006, 10:44
Спасибо! Действительно так лучше :-) С наступившим!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)