|
|
|
| Как русский юникод в транслит преобразовать? | |
|
|
| |
|
|
|
|
для: ddhvvn
(09.04.2009 в 16:36)
| | а как эта функция относится к разным кодировкам?
месяца полтора назад я с помощью этой функции русский юникод пытался перевести - не получилось. Ещё разок проверю-попробую. | |
|
|
|
|
|
|
|
для: Zilog
(09.04.2009 в 17:21)
| | Нет, с юникодом этот способ не рработает. есть ещё варианты? | |
|
|
|
|
|
|
|
для: Zilog
(09.04.2009 в 17:55)
| | Господа програмеры, проблема таки актуальна.
Поясню смысл затеи - заношу имя файла в БД, предварительно поменяв пробелы на "_", но хтелось бы ещё русские буквы перевести в траслит, ибо если этого не делать, получаем на выходе бяку. Речь идет в данном случае о русском юникоде, но по уму хочется что-то универсальное. Функция, что предлагается выше - коректно работает только с виндовой кодировкой.
Буду очень признателен за помощь, или направления, в котором надо двигаться. | |
|
|
|
|
|
|
|
для: Zilog
(10.04.2009 в 03:05)
| | направление - iconv() | |
|
|
|
|
|
|
|
для: Zilog
(10.04.2009 в 03:05)
| | Zilog! Мне кажется, Вы подходите к проблеме совсем не с той стороны, с какой нужно. А именно нужно разобраться почему "на выходе бяка", а не крошить текст | |
|
|
|
|
|
|
|
для: Лерк
(11.04.2009 в 17:18)
| | +1 | |
|
|
|
|
|
|
|
для: Лерк
(11.04.2009 в 17:18)
| | знал бы - за помощью не обращался. Логика у меня такая: если всё делать в 1251, то прблем никаких нет. Если документ/страница в юникоде - происходит неправильная транслитерация.
Перевод в транслит делаю с помощью этой функции:
public function Translit($st)
{
$st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ-", "abvgdeeziyklmnoprstufh'ye-");
$st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ-", "ABVGDEEZIYKLMNOPRSTUFH'YE-");
$st=strtr($st, array(
"ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh",
"щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
"Ж"=>"Zh", "Ц"=>"Ts", "Ч"=>"Ch", "Ш"=>"Sh",
"Щ"=>"Shch","Ь"=>"", "Ю"=>"Yu", "Я"=>"Ya",
"ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye",
" "=>"_"
)
);
return $st;
}
|
Если на вход подавать в кодировке 1251 (преобразовывал с помощью iconv), то тоже неработает. В голове у меня некоторая каша: в обычной кодировке каждый символ кодируется одним байтом, в юникоде - двумя. Я тут мыслю как системщик, и возможно это меня подводит, но по другому я не могу. Как работает на самом деле функция strtr, в каком виде-формате она получает строку, что у неё внутри происходит - мне не известно, следовательно, остается только фантазировать: текст в юникоде => транслитерация => вывод в юникоде. Как мне видится - нарушение происходит в функции strtr, которая видит символы как однобайтовые. Так что ли...? | |
|
|
|
|
|
|
|
для: Zilog
(13.04.2009 в 14:10)
| | >Если на вход подавать в кодировке 1251 (преобразовывал с помощью iconv), то тоже неработает.
Вот это крайне странно...
(если конечно текст этой функции набран в 1251) | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2009 в 14:50)
| | хм.. текст набран в юникоде, разумеется - весь код, сайт - всё в нем. Но мысль понял, сейчас поэксперементирую.
Тогда такой вопрос: если я беру файл с хотинга, имя его в какой кодировке я получу? | |
|
|
|
|
|
|
|
для: Zilog
(13.04.2009 в 18:09)
| | в какой отдадут. | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2009 в 18:11)
| | >в какой отдадут.
т.е. универскальное решение не светит? | |
|
|
|
|
|
|
|
для: Zilog
(13.04.2009 в 18:24)
| | универсальное решение, как обычно - не отдавать контент с метаданными в национальных кодировках. | |
|
|
|
|
|
|
|
для: Trianon
(13.04.2009 в 18:31)
| | >универсальное решение, как обычно - не отдавать контент с метаданными в национальных кодировках.
согласен. Может тогда я иду неправильным путем - и грузить фотки на сервер и пописывая их имена в базе - русским же языком? Но так не работает...
Ладно, в любом случае вопрос считаю закрытым. Проблему, по традиции, переложим на плечи пользователя. Эх.
Спасибо всем за участие. | |
|
|
|
|
|
|
|
для: Zilog
(13.04.2009 в 18:42)
| | Странно, что проигнорякали. Мой вариант работает под utf надо только массив дописать... | |
|
|
|
|
|
|
|
для: Николай2357
(13.04.2009 в 22:19)
| | >Странно, что проигнорякали. Мой вариант работает под utf надо только массив дописать...
Так-с, попробую. Но, как помню, массив в юникоде был.
Всё равно спасибо, ещё раз проверю. | |
|
|
| |
|
|
|
|
для: Zilog
(10.04.2009 в 03:05)
| |
<?
function translate($str)
{
$arr = array(
'а' => 'a',
'б' => 'b',
'в' => 'v',
.
.
.
);
$key = array_keys($arr);
$val = array_values($arr);
$trans = str_replace($key,$val,$str);
}
echo translate('бяка');
|
| |
|
|
|
|
|
|
|
для: Zilog
(09.04.2009 в 14:07)
| |
<html>
<head>
<title>
Перевод с русского на транслит и наоборот
</title>
</head>
<body>
<form action=translit.php method=POST>
Текст:<br>
<textarea name=txt rows=4 cols=40>
<?php
if (isset($txt)) echo $txt;
?>
</textarea>
<br>
<input type=radio name=tr value=ru checked=true> Перевести на транслит <br>
<input type=radio name=tr value=eng> Перевести на русский <br>
<input type=submit value=Перевести>
</form>
<?php
if (isset($txt))
{
$txt = StrToLower($txt);
if ($tr==='ru')
{
$txt = str_replace('а','a',$txt);
$txt = str_replace('б','b',$txt);
$txt = str_replace('в','v',$txt);
$txt = str_replace('г','g',$txt);
$txt = str_replace('д','d',$txt);
$txt = str_replace('е','e',$txt);
$txt = str_replace('ж','zh',$txt);
$txt = str_replace('з','z',$txt);
$txt = str_replace('и','i',$txt);
$txt = str_replace('й','j',$txt);
$txt = str_replace('к','k',$txt);
$txt = str_replace('л','l',$txt);
$txt = str_replace('м','m',$txt);
$txt = str_replace('н','n',$txt);
$txt = str_replace('о','o',$txt);
$txt = str_replace('п','p',$txt);
$txt = str_replace('р','r',$txt);
$txt = str_replace('с','s',$txt);
$txt = str_replace('т','t',$txt);
$txt = str_replace('у','u',$txt);
$txt = str_replace('ф','f',$txt);
$txt = str_replace('х','h',$txt);
$txt = str_replace('ц','c',$txt);
$txt = str_replace('ч','ch',$txt);
$txt = str_replace('ш','sh',$txt);
$txt = str_replace('щ','sch',$txt);
$txt = str_replace('ъ','\'',$txt);
$txt = str_replace('ы','y',$txt);
$txt = str_replace('ь','\'',$txt);
$txt = str_replace('э',']',$txt);
$txt = str_replace('ю','yu',$txt);
$txt = str_replace('я','ya',$txt);
}
if ($tr==='eng')
{
$txt = str_replace('sch','щ',$txt);
$txt = str_replace('yu','ю',$txt);
$txt = str_replace('ya','я',$txt);
$txt = str_replace('ch','ч',$txt);
$txt = str_replace('sh','ш',$txt);
$txt = str_replace('a','а',$txt);
$txt = str_replace('b','б',$txt);
$txt = str_replace('v','в',$txt);
$txt = str_replace('g','г',$txt);
$txt = str_replace('d','д',$txt);
$txt = str_replace('e','е',$txt);
$txt = str_replace('zh','ж',$txt);
$txt = str_replace('z','з',$txt);
$txt = str_replace('i','и',$txt);
$txt = str_replace('j','й',$txt);
$txt = str_replace('k','к',$txt);
$txt = str_replace('l','л',$txt);
$txt = str_replace('m','м',$txt);
$txt = str_replace('n','н',$txt);
$txt = str_replace('o','о',$txt);
$txt = str_replace('p','п',$txt);
$txt = str_replace('r','р',$txt);
$txt = str_replace('s','с',$txt);
$txt = str_replace('t','т',$txt);
$txt = str_replace('u','у',$txt);
$txt = str_replace('f','ф',$txt);
$txt = str_replace('h','х',$txt);
$txt = str_replace('c','ц',$txt);
$txt = str_replace('\'','ъ',$txt);
$txt = str_replace('y','ы',$txt);
$txt = str_replace('\'','ь',$txt);
$txt = str_replace(']','э',$txt);
}
echo 'Результат: <br><b>'.$txt;
}
?>
</body>
</html>
|
| |
|
|
|
|