Транслитерация. Подскажите мысль.

Ленивое Z
На сайте с 27.08.2007
Offline
106
1179

Нужно перевести строку в транслит, а потом ее обратно расшифровать. Если конкретнее, то на странице есть список чего-то, допустим продуктов, товару майонез должна формироваться ссылка типа site.ru/poisk.aspx?id=majonez, при переходе по ссылке параметр id должен обратно превратиться в майонез, так как по нему идет выборка по базе.

Создать словарь замены побуквенный приведет к переводу в одну сторону, а в обратную транслитерировать не всегда получается (если букву "ш" заменять на "sh", то слово "схимник" переведется как "shimnik", а обратно мы получим "шимник ... ну и так, навскидку, с буквами "ч", "щ", "ё", "ю").

Транслит.ру фразу:

Схуяли майонез в Цхинвали конвейерный?

транслитерирует как:

Shujali majonez v Chinvali konvejernyj?

а обратно выдает:

Шуяли маёнез в Чинвали конвеэрный?

Гугл примерно одинаково спотыкается.

Чотакакта мыслей, кроме как параллельно в сессии передавать параметр на кириллице, особо и нет. Куда копать? Разве выхода нет? Шуяли?!

P.S. сделаю наверное через сессию, а это так, моск поломать.

LEOnidUKG
На сайте с 25.11.2006
Offline
1723
#1

А зачем обратно? Храните в БД оригинал и транслит.

✅ Мой Телеграм канал по SEO, оптимизации сайтов и серверов: https://t.me/leonidukgLIVE ✅ Качественное и рабочее размещение SEO статей СНГ и Бурж: https://getmanylinks.ru/
Ленивое Z
На сайте с 27.08.2007
Offline
106
#2
LEOnidUKG:
А зачем обратно? Храните в БД оригинал и транслит.

БД большая и проект уже пятый год работает, внутренности переделывать не хочется, сейчас параметр так и передается site.ru/search.aspx?id=майонез, только урлы с кириллицей Сапе не нравятся, несколько тысяч страниц получаются бесхозными.

n0name
На сайте с 22.12.2006
Offline
54
#3

Если внешний вид ссылки не критичен и регистр букв в слове не важен, то вместо проблемных символов, можно задействовать оставшиеся буквы английского алфавита (qwxy) и/или заглавные буквы (ё = J, ч = CH, ш = SH).

Если такой вариант не подходит, то можно создать в БД отдельную таблицу с двумя полями: исходное слово и его транслитерация. На внутренности это никак не повлияет.

P.S. А как через сессии это можно сделать? Если я сразу зайду на страницу site.ru/poisk.aspx?id=majonez, то откуда исходное слово возьмется?

Сервис сравнения цена на VPS (http://vpska.com/)
Ёхан Палыч
На сайте с 07.05.2006
Offline
169
#4

Если урлы для сапы, то можно и через base_decode

<?php 
$s= "майонез";
$b= base64_encode($s);
echo "<a href=?id=$b>$s</a><br>";
echo $_GET["id"]." - ". base64_decode($_GET["id"]);
?>

Еще необходимо стоп-слово poisk из урла выкинуть. А вообще, с кириллицей проблем быть не должно, если использовать urlencode

Ленивое Z
На сайте с 27.08.2007
Offline
106
#5
n0name:
Если я сразу зайду на страницу site.ru/poisk.aspx?id=majonez, то откуда исходное слово возьмется?

Ниоткуда) Этот вариант был отброшен сразу после того как написан) Уже почти доделал, только не таблицей в БД, а текстовым файликом (список каждую неделю немного изменяется, поэтому решил, что через файл лучше).

P
На сайте с 25.05.2007
Offline
103
#6

Как вариант: обратный транслитератор (из латинницы в кириллицу) переписать, чтоб транслитерация проходила в 2 этапа:

первый - замена букв, состоящих из нескольких символов: sh - ш, ch - ч, yu - ю, и т.д.

второй - в получившемся полупереведенном тексте заменять остальные буквы: b - б, v - в, и т.д.

Будет конечно чуть дольше, но совсем незначительно, а проблем со "схимником" не будет точно.

А с буквами типа "е", которая может быть и "э" и "е", надо нестандартный перевод значит делать, чтоб каждой букве соответствовал лишь один (набор) символ(ов)., типа e - e, je - э.

coolakov.ru/tools (http://coolakov.ru/tools/): определение конкурентов (http://coolakov.ru/tools/most_promoted/), кластеризация запросов (http://coolakov.ru/tools/razbivka/) и т.д.
Ленивое Z
На сайте с 27.08.2007
Offline
106
#7
pimandr:
а проблем со "схимником" не будет точно.

Это понятно, что мы заменяем сначала многобуквенные сочетания (у "щ" предполагалось вообще "sch"), только вот как раз при этом подходе "схимники" и проявляются.

unlimbox
На сайте с 03.01.2008
Offline
56
#8
А вообще, с кириллицей проблем быть не должно, если использовать urlencode

Совершенно верно. У меня облако меток фунциклирует по такому принципу - перед выводом в браузер кириллица в урле обрабатывается urlencode, а при переходе по урлу, содержащему кириллицу, - urldecode и по полученному результату выборка из БД.

JamBlog.ru (http://jamblog.ru)
gormarket
На сайте с 29.12.2010
Offline
47
#9

Когда для меня возник такой вопрос, посмотрев что есть на эту тему в сети, я

остановился на стандарте ISO 9 (Транслитерация славянских алфавитов с возможность восстановления текста в исходном виде, система Б)

В системе А несколько символов, "неподходящих" для URL при транслитерации русского языка (в системе Б всего 1 - "`")

Вставил на сайт 2 функции на PHP (превод в транслит и обратно), но при использовнии таких адресов на сайте заменяю "`" на "%60"

С поисковиками проблем не возникает, но вот если ссылку размещают на сторонних сайтах, бывает что адрес обрезается по "`", или заменяется "`" на "~"


// функция превода текста из кириллицы в траскрипт
function translite($st){
// Сначала заменяем "односимвольные" фонемы.
$st=strtr($st,'абвгдезийклмнопрстуфх','abvgdezijklmnoprstufx');
$st=strtr($st,'АБВГДЕЗИЙКЛМНОПРСТУФХ','ABVGDEZIJKLMNOPRSTUFX');
// Затем - "многосимвольные".
$st=strtr($st,array(
'ё'=>'yo', 'ж'=>'zh', 'ц'=>'cz', 'ч'=>'ch', 'ш'=>'sh',
'щ'=>'shh', 'ъ'=>'``', 'ы'=>'y`', 'ь'=>'`', 'э'=>'e`', 'ю'=>'yu', 'я'=>'ya',
'Ё'=>'YO', 'Ж'=>'ZH', 'Ц'=>'CZ', 'Ч'=>'CH', 'Ш'=>'SH',
'Щ'=>'SHH', 'Ъ'=>'``', 'Ы'=>'Y`', 'Ь'=>'`', 'Э'=>'E`', 'Ю'=>'YU', 'Я'=>'YA'
)
);
return $st;
}
// функция превода текста из траскрипта в кириллицу
function untranslite($st){
// Сначала заменяем "многосимвольные" фонемы.
$st=strtr($st,array(
'yo'=>'ё', 'zh'=>'ж', 'cz'=>'ц', 'ch'=>'ч', 'sh'=>'ш',
'shh'=>'щ', '``'=>'ъ', 'y`'=>'ы', '`'=>'ь', 'e`'=>'э', 'yu'=>'ю', 'ya'=>'я',
'YO'=>'Ё', 'ZH'=>'Ж', 'CZ'=>'Ц', 'CH'=>'Ч', 'SH'=>'Ш',
'SHH'=>'Щ', '``'=>'ъ', 'Y`'=>'Ы', '`'=>'ь', 'E`'=>'Э', 'YU'=>'Ю', 'YA'=>'Я'
)
);
// Затем - "односимвольные"
$st=strtr($st,'abvgdezijklmnoprstufx','абвгдезийклмнопрстуфх');
$st=strtr($st,'ABVGDEZIJKLMNOPRSTUFX','АБВГДЕЗИЙКЛМНОПРСТУФХ');
return $st;
}

P.S. похоже у меня не полностью ISO 9, там Х->H, а у меня Х->X

Товары и цены в магазинах Вашего города: Городской рынок (http://gormarket.ru/)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий