Вот есть функция транслитерации. Код (Text): function translit($rus_text) { echo $rus_text."<br>"; $rus_text = "Ну ты и молодец"; $rus_text1 = iconv("utf-8","windows-1251",$rus_text); $arr1 = "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ"; $arr1 = iconv("utf-8","windows-1251","абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ"); $arr2 = "abvgdejziyklmnoprstufieABVGDEJZIYKLMNOPRSTUFIE"; //$rus_text1 = $rus_text; $rus_text1 = strtr($rus_text1,$arr1, $arr2); echo $rus_text1."<br>"; $rus_text1 = strtr($rus_text1, array( 'е'=>"yo", 'х'=>'h','ц'=>"ts",'ч'=>"ch",'ш'=>"sh", 'щ'=>"shch",'ъ'=>'','ь'=>'','ю'=>"yu",'я'=>"ya", 'Е'=>"Yo",'Х'=>"H",'Ц'=>"Ts",'Ч'=>"Ch",'Ш'=>"Sh", 'Щ'=>"Shch",'Ъ'=>'','Ь'=>'','Ю'=>"Yu",'Я'=>"Ya")); return $rus_text1; }; 1) Кодировка самого сценария UTF8. 2) При отладке получается следующее: a) в переменную $rus_text вместо текста "Ну ты и молодец" попадает такое "РќСѓ ты Рё молодец". Я так понимаю это явление. Что-то (я вот хотел спросить) воспринимает текст в UTF8 как текст в windows-1251. b) после перекодировки $rus_text с помощью iconv из UTF8 в windows-1251 получаем нормальный текст: "Ну ты и молодец". Я так понимаю это явление: Что-то также воспринимает значение в переменной $rus_text как текст в кодировке windows-1251, что и есть правильно(после применения функции iconv). c)сперва в массив $arr1 помещается значение "Р°Р±РІРіРґРµР¶Р·РёР№РєР»РјРЅРѕРїСЂСЃС‚СѓС„С‹СЌРђР‘Р’Р“Р”Р•Р–Р—Р˜Р™РљР›РњРќРћРџР РЎРўРЈР¤Р«Р" Как я понимаю это. Это белеберда есть ни что иное как текст "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ". Этот текст воспринимается ЧЕМ-ТО как текст в кодировке windows-1251 - ВОТ И ПОЛУЧАЕТСЯ БЕЛЕБЕРДА. d) Затем в массив $arr1 помещается этот же текст, который перекодирован в кодировку windows-1251 из кодировки UTF8. И он правильно отображается в значении массива (при отладке с помощью PHPEd), потому что ЧТО-ТО понимает эту кодировку и правильно его раскодировывает. Короче, используя перевод кириллицы из кодировки utf-8 в кодировку win-1251, функция транслитерации Tranlit работает правильно. А вот уже при транслитерации букв ц, щ, х, ь, ъ, ю, я происходит ошибка. Причина та же - эти буквы (ё, ц, ш, щ, х и т.д.) я не перекодирую в win-1251. Как я понимаю вместо них получается белеберда и поэтому функция strtr не находит совпадений между содержимым $rus_text1 и этим массивом. Вопрос в следущем: Кто отвечает за кодировку значений в переменных? Что это за ЧТО-ТО?Кто текст в кодировке UTF8 понимает как текст в windows-1251?Где это можно поменять?Почему массивы из кириллических букв рассматриваются с точки зрения кодировки windows-1251?Они ведь написаны на UTF8 в редакторе NOTEPUD++ Использую следующую связку: PHP 5.3, APACHE 2.2, PHPEd 5.95.
http://php.net/manual/ru/function.mb-co ... coding.html http://www.php.su/functions/?mb-convert-encoding ?=)
BaSh ух ты, капса то сколько... если ты пишешь значения переменных напрямую в файле, то убедишь, что кодировка стоит именно UTF-8 без BOM. знаю, что ты писал об этом, но проверь ещё раз, а то меня смущает твой редактор если данные получаешь из базы данных - убедись, что кодировка соединения стоит utf-8, а не 1251.
Значения переменных в файле я указал явно только здесь, чтобы разобраться. А так вообще беру из формы ($_REQUEST[]) - результат тот же был - белеберда)) я использую редактор в PHPEd и Notepad++. Сейчас сделаю следующее: с помощью Notepad++ перекодирую кириллицу в кодировку UTF8 без BOM, вроде там была такая возможность.
Не помогает. Я в документрут положил файл .htaccess, в котором прописал AddDefaultCharset utf-8. Весь текст скрипта выделил и выполнил команду Преобразовать в UTF-8 без BOM. Получается следующее: если не перекодировать в windows-1251 переменную $rus_text и массив $arr1: PHP: $rus_text = iconv("utf-8","windows-1251",$rus_text); $arr1 = iconv("utf-8","windows-1251","абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ"); , то получается белеберда. Просто вывод переменной: PHP: echo $rus_text."<br>"; дает тот текст, который правильно отображается. Вывод переменной после применения к ней функции strtr PHP: $rus_text = strtr($rus_text,$arr1, $arr2); echo $rus_text."<br>"; $rus_text = strtr($rus_text, array( 'е'=>"yo", 'х'=>'h','ц'=>"ts",'ч'=>"ch",'ш'=>"sh", 'щ'=>"shch",'ъ'=>'','ь'=>'','ю'=>"yu",'я'=>"ya", 'Е'=>"Yo",'Х'=>"H",'Ц'=>"Ts",'Ч'=>"Ch",'Ш'=>"Sh", 'Щ'=>"Shch",'Ъ'=>'','Ь'=>'','Ю'=>"Yu",'Я'=>"Ya")); echo $rus_text."<br>"; дает белеберду "ZђZ‘Z’Z“Z”Z•Z•Z–Z—ZZZљZ›ZњZќZћ".
вот и пляши отсюда. например я вообще не пользуюсь iconv/mb_ функциями, т.к. весь сайт построен на одной кодировке, которая используется также и в соединении с базой данных
теперь я заметил еще одну особенность: оказывается второй вывод strtr работает правильно, т.е. если убрать первый вызов strtr так, чтобы она не изменяла значение переменной $rus_text, то там где в вызове функции strtr есть только два аргумента - строковая переменная и ассоциативный массив, то она правильно работает. Правильно находит буквы ц, ш, щ и т.д. и заменяет их на латинские аналоги. Вообще ничего не понятно.
Нет, просто мне же нужно выполнить транслитерацию введенного текста. А просто вывод дает тот же текст на русском). Я хочу понять почему не работает. Я учусь.
Сдается мне, что Apache работает в windows-1251?хотя просто вывод правильно отображает. Просто во внутреннем представлении я вижу при отладке, что в переменную $rus_text помещается какая-то белеберда, но при простом выводе в браузере она отображается корректно как русский текст. Если же эту переменную перекодировать с помощь iconv в windows-1251, то при отладке во внутреннем представлении она правильно отображается, а вот уже при простом выводе в браузере получаются квадратики. Насколько я понял - это потому что в .htaccess я прописал AddDefaultCharset utf-8.
Лучше отправлять header с явным указанием content-type и дублировать его же в META. Тогда не нужно будет пенять на апач. Определитесь, в каком формате будете отдавать из php. Если используется БД, то первым запросом дайте БД понять, что вы хотите получать ответы в какой-то конкретной кодировке. Если в базе уже неправильная кодировка (т.е. формат записей противоречит формату базы/таблицы), то сделайте экспорт базы, почините руками кодировку в описании структуры таблицы на соответствующую, потом сделайте импорт базы обратно. после импорта можно сменить кодировку таблицы, чтобы она соответствовала кодировке базы.
PHP: function translit($rus_text) { //echo $rus_text." Вывод до обработки вначале.<br>"; $rus_text = iconv("utf-8","windows-1251",$rus_text); //echo $rus_text." Вывод после iconv(из utf8 в wind-1251).<br>"; //$arr1 = "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ"; $arr1 = iconv("utf-8","windows-1251","абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ"); $arr2 = "abvgdejziyklmnoprstufieABVGDEJZIYKLMNOPRSTUFIE"; $rus_text = strtr($rus_text,$arr1, $arr2); //echo $rus_text." Вывод после первого применения стртр<br>"; $rus_text = iconv("windows-1251","utf-8",$rus_text); $rus_text = strtr($rus_text, array( 'е'=>"yo", 'х'=>'h','ц'=>"ts",'ч'=>"ch",'ш'=>"sh", 'щ'=>"shch",'ъ'=>'','ь'=>'','ю'=>"yu",'я'=>"ya", 'Е'=>"Yo",'Х'=>"H",'Ц'=>"Ts",'Ч'=>"Ch",'Ш'=>"Sh", 'Щ'=>"Shch",'Ъ'=>'','Ь'=>'','Ю'=>"Yu",'Я'=>"Ya")); return $rus_text; }; Вот в таком виде функция работает полностью. Получается до первого вызова функции strtr я преобразую строку в windows-1251, транслирую её, затем обратно перевожу в utf8, и снова применяю к ней функция strtr (второй вызов функции). Не пойму почему именно так она работает?
Нет никаких БД. Просто есть форма, в которую вводишь текст, жмешь кнопку и получаешь транслированный текст. (Я изучаю PHP и поставил себе такую задачу).