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

Форум PHP

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

 

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

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

тема: Как русский юникод в транслит преобразовать?
 
 автор: Zilog   (09.04.2009 в 14:07)   письмо автору
 
 

Как русский юникод в транслит преобразовать?

  Ответить  
 
 автор: ddhvvn   (09.04.2009 в 16:36)   письмо автору
 
   для: Zilog   (09.04.2009 в 14:07)
 

Перевод русского текста в транслит

  Ответить  
 
 автор: Zilog   (09.04.2009 в 17:21)   письмо автору
 
   для: ddhvvn   (09.04.2009 в 16:36)
 

а как эта функция относится к разным кодировкам?
месяца полтора назад я с помощью этой функции русский юникод пытался перевести - не получилось. Ещё разок проверю-попробую.

  Ответить  
 
 автор: Zilog   (09.04.2009 в 17:55)   письмо автору
 
   для: Zilog   (09.04.2009 в 17:21)
 

Нет, с юникодом этот способ не рработает. есть ещё варианты?

  Ответить  
 
 автор: Zilog   (10.04.2009 в 03:05)   письмо автору
 
   для: Zilog   (09.04.2009 в 17:55)
 

Господа програмеры, проблема таки актуальна.

Поясню смысл затеи - заношу имя файла в БД, предварительно поменяв пробелы на "_", но хтелось бы ещё русские буквы перевести в траслит, ибо если этого не делать, получаем на выходе бяку. Речь идет в данном случае о русском юникоде, но по уму хочется что-то универсальное. Функция, что предлагается выше - коректно работает только с виндовой кодировкой.

Буду очень признателен за помощь, или направления, в котором надо двигаться.

  Ответить  
 
 автор: nikita2206   (10.04.2009 в 15:42)   письмо автору
 
   для: Zilog   (10.04.2009 в 03:05)
 

направление - iconv()

  Ответить  
 
 автор: Лерк   (11.04.2009 в 17:18)   письмо автору
 
   для: Zilog   (10.04.2009 в 03:05)
 

Zilog! Мне кажется, Вы подходите к проблеме совсем не с той стороны, с какой нужно. А именно нужно разобраться почему "на выходе бяка", а не крошить текст

  Ответить  
 
 автор: Trianon   (11.04.2009 в 17:29)   письмо автору
 
   для: Лерк   (11.04.2009 в 17:18)
 

+1

  Ответить  
 
 автор: Zilog   (13.04.2009 в 14:10)   письмо автору
 
   для: Лерк   (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, которая видит символы как однобайтовые. Так что ли...?

  Ответить  
 
 автор: Trianon   (13.04.2009 в 14:50)   письмо автору
 
   для: Zilog   (13.04.2009 в 14:10)
 

>Если на вход подавать в кодировке 1251 (преобразовывал с помощью iconv), то тоже неработает.

Вот это крайне странно...
(если конечно текст этой функции набран в 1251)

  Ответить  
 
 автор: Zilog   (13.04.2009 в 18:09)   письмо автору
 
   для: Trianon   (13.04.2009 в 14:50)
 

хм.. текст набран в юникоде, разумеется - весь код, сайт - всё в нем. Но мысль понял, сейчас поэксперементирую.

Тогда такой вопрос: если я беру файл с хотинга, имя его в какой кодировке я получу?

  Ответить  
 
 автор: Trianon   (13.04.2009 в 18:11)   письмо автору
 
   для: Zilog   (13.04.2009 в 18:09)
 

в какой отдадут.

  Ответить  
 
 автор: Zilog   (13.04.2009 в 18:24)   письмо автору
 
   для: Trianon   (13.04.2009 в 18:11)
 

>в какой отдадут.

т.е. универскальное решение не светит?

  Ответить  
 
 автор: Trianon   (13.04.2009 в 18:31)   письмо автору
 
   для: Zilog   (13.04.2009 в 18:24)
 

универсальное решение, как обычно - не отдавать контент с метаданными в национальных кодировках.

  Ответить  
 
 автор: Zilog   (13.04.2009 в 18:42)   письмо автору
 
   для: Trianon   (13.04.2009 в 18:31)
 

>универсальное решение, как обычно - не отдавать контент с метаданными в национальных кодировках.

согласен. Может тогда я иду неправильным путем - и грузить фотки на сервер и пописывая их имена в базе - русским же языком? Но так не работает...

Ладно, в любом случае вопрос считаю закрытым. Проблему, по традиции, переложим на плечи пользователя. Эх.

Спасибо всем за участие.

  Ответить  
 
 автор: Николай2357   (13.04.2009 в 22:19)   письмо автору
 
   для: Zilog   (13.04.2009 в 18:42)
 

Странно, что проигнорякали. Мой вариант работает под utf надо только массив дописать...

  Ответить  
 
 автор: Zilog   (06.05.2009 в 00:54)   письмо автору
 
   для: Николай2357   (13.04.2009 в 22:19)
 

>Странно, что проигнорякали. Мой вариант работает под utf надо только массив дописать...

Так-с, попробую. Но, как помню, массив в юникоде был.
Всё равно спасибо, ещё раз проверю.

  Ответить  
 
 автор: Николай2357   (06.05.2009 в 01:53)   письмо автору
 
   для: Zilog   (06.05.2009 в 00:54)
 

http://softtime.ru/forum/read.php?id_forum=1&id_theme=64851&page=1

  Ответить  
 
 автор: Николай2357   (12.04.2009 в 00:19)   письмо автору
 
   для: 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('бяка'); 

  Ответить  
 
 автор: BSD   (13.04.2009 в 23:05)   письмо автору
 
   для: 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>


  Ответить  
Rambler's Top100
вверх

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