За последние 24 часа нас посетили 17607 программистов и 1591 робот. Сейчас ищут 1474 программиста ...

Кто опред-т в какой кодировке сохр-ся значение переменной?

Тема в разделе "PHP для новичков", создана пользователем BaSh, 13 апр 2011.

  1. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Вот есть функция транслитерации.
    Код (Text):
    1.     function translit($rus_text) {
    2.         echo $rus_text."<br>";
    3.         $rus_text = "Ну ты и молодец";
    4.         $rus_text1 = iconv("utf-8","windows-1251",$rus_text);
    5.         $arr1 = "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ";
    6.         $arr1 = iconv("utf-8","windows-1251","абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ");
    7.         $arr2 = "abvgdejziyklmnoprstufieABVGDEJZIYKLMNOPRSTUFIE";
    8.         //$rus_text1 = $rus_text;
    9.         $rus_text1 = strtr($rus_text1,$arr1, $arr2);
    10.         echo $rus_text1."<br>";
    11.         $rus_text1 = strtr($rus_text1, array(
    12.             'е'=>"yo", 'х'=>'h','ц'=>"ts",'ч'=>"ch",'ш'=>"sh",
    13.             'щ'=>"shch",'ъ'=>'','ь'=>'','ю'=>"yu",'я'=>"ya",
    14.             'Е'=>"Yo",'Х'=>"H",'Ц'=>"Ts",'Ч'=>"Ch",'Ш'=>"Sh",
    15.             'Щ'=>"Shch",'Ъ'=>'','Ь'=>'','Ю'=>"Yu",'Я'=>"Ya"));
    16.         return $rus_text1;
    17.     };
    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.
     
  2. Invision

    Invision Активный пользователь

    С нами с:
    26 фев 2009
    Сообщения:
    1.437
    Симпатии:
    1
    Адрес:
    Томск
  3. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Ну и зачем мне строковые функции?

    Пожалуйста, отвечайте на вопросы)))
     
  4. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    BaSh
    ух ты, капса то сколько...


    если ты пишешь значения переменных напрямую в файле, то убедишь, что кодировка стоит именно UTF-8 без BOM.
    знаю, что ты писал об этом, но проверь ещё раз, а то меня смущает твой редактор
    если данные получаешь из базы данных - убедись, что кодировка соединения стоит utf-8, а не 1251.
     
  5. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Значения переменных в файле я указал явно только здесь, чтобы разобраться. А так вообще беру из формы ($_REQUEST[]) - результат тот же был - белеберда))

    я использую редактор в PHPEd и Notepad++.
    Сейчас сделаю следующее: с помощью Notepad++ перекодирую кириллицу в кодировку UTF8 без BOM, вроде там была такая возможность.
     
  6. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Не помогает.

    Я в документрут положил файл .htaccess, в котором прописал AddDefaultCharset utf-8.
    Весь текст скрипта выделил и выполнил команду Преобразовать в UTF-8 без BOM.
    Получается следующее:
    если не перекодировать в windows-1251 переменную $rus_text и массив $arr1:
    PHP:
    1.  $rus_text = iconv("utf-8","windows-1251",$rus_text);
    2. $arr1 = iconv("utf-8","windows-1251","абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ");
    3.  
    , то получается белеберда.
    Просто вывод переменной:
    PHP:
    1. echo $rus_text."<br>";
    дает тот текст, который правильно отображается.

    Вывод переменной после применения к ней функции strtr
    PHP:
    1. $rus_text = strtr($rus_text,$arr1, $arr2);
    2.         echo $rus_text."<br>";
    3.         $rus_text = strtr($rus_text, array(
    4.             'е'=>"yo", 'х'=>'h','ц'=>"ts",'ч'=>"ch",'ш'=>"sh",
    5.             'щ'=>"shch",'ъ'=>'','ь'=>'','ю'=>"yu",'я'=>"ya",
    6.             'Е'=>"Yo",'Х'=>"H",'Ц'=>"Ts",'Ч'=>"Ch",'Ш'=>"Sh",
    7.             'Щ'=>"Shch",'Ъ'=>'','Ь'=>'','Ю'=>"Yu",'Я'=>"Ya"));
    8.         echo $rus_text."<br>";
    дает белеберду "ZђZ‘Z’Z“Z”Z•Z•Z–Z—Z˜Z˜ZљZ›ZњZќZћ".
     
  7. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    вот и пляши отсюда. например я вообще не пользуюсь iconv/mb_ функциями, т.к. весь сайт построен на одной кодировке, которая используется также и в соединении с базой данных
     
  8. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    теперь я заметил еще одну особенность:
    оказывается второй вывод strtr работает правильно, т.е. если убрать первый вызов strtr так, чтобы она не изменяла значение переменной $rus_text, то там где в вызове функции strtr есть только два аргумента - строковая переменная и ассоциативный массив, то она правильно работает. Правильно находит буквы ц, ш, щ и т.д. и заменяет их на латинские аналоги.
    Вообще ничего не понятно.
     
  9. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Нет, просто мне же нужно выполнить транслитерацию введенного текста.
    А просто вывод дает тот же текст на русском).
    Я хочу понять почему не работает. Я учусь.
     
  10. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Сдается мне, что Apache работает в windows-1251?хотя просто вывод правильно отображает. Просто во внутреннем представлении я вижу при отладке, что в переменную $rus_text помещается какая-то белеберда, но при простом выводе в браузере она отображается корректно как русский текст.
    Если же эту переменную перекодировать с помощь iconv в windows-1251, то при отладке во внутреннем представлении она правильно отображается, а вот уже при простом выводе в браузере получаются квадратики. Насколько я понял - это потому что в .htaccess я прописал AddDefaultCharset utf-8.
     
  11. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Лучше отправлять header с явным указанием content-type и дублировать его же в META. Тогда не нужно будет пенять на апач.
    Определитесь, в каком формате будете отдавать из php. Если используется БД, то первым запросом дайте БД понять, что вы хотите получать ответы в какой-то конкретной кодировке. Если в базе уже неправильная кодировка (т.е. формат записей противоречит формату базы/таблицы), то сделайте экспорт базы, почините руками кодировку в описании структуры таблицы на соответствующую, потом сделайте импорт базы обратно. после импорта можно сменить кодировку таблицы, чтобы она соответствовала кодировке базы.
     
  12. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    PHP:
    1.     function translit($rus_text) {
    2.         //echo $rus_text." Вывод до обработки вначале.<br>";
    3.         $rus_text = iconv("utf-8","windows-1251",$rus_text);
    4.         //echo $rus_text." Вывод после iconv(из utf8 в wind-1251).<br>";
    5.         //$arr1 = "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ";
    6.         $arr1 = iconv("utf-8","windows-1251","абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ");
    7.         $arr2 = "abvgdejziyklmnoprstufieABVGDEJZIYKLMNOPRSTUFIE";
    8.         $rus_text = strtr($rus_text,$arr1, $arr2);
    9.         //echo $rus_text." Вывод после первого применения стртр<br>";
    10.         $rus_text = iconv("windows-1251","utf-8",$rus_text);       
    11.         $rus_text = strtr($rus_text, array(
    12.             'е'=>"yo", 'х'=>'h','ц'=>"ts",'ч'=>"ch",'ш'=>"sh",
    13.             'щ'=>"shch",'ъ'=>'','ь'=>'','ю'=>"yu",'я'=>"ya",
    14.             'Е'=>"Yo",'Х'=>"H",'Ц'=>"Ts",'Ч'=>"Ch",'Ш'=>"Sh",
    15.             'Щ'=>"Shch",'Ъ'=>'','Ь'=>'','Ю'=>"Yu",'Я'=>"Ya"));
    16.         return $rus_text;
    17.     };
    Вот в таком виде функция работает полностью.
    Получается до первого вызова функции strtr я преобразую строку в windows-1251, транслирую её, затем обратно перевожу в utf8, и снова применяю к ней функция strtr (второй вызов функции).
    Не пойму почему именно так она работает?
     
  13. BaSh

    BaSh Активный пользователь

    С нами с:
    26 фев 2008
    Сообщения:
    16
    Симпатии:
    0
    Нет никаких БД. Просто есть форма, в которую вводишь текст, жмешь кнопку и получаешь транслированный текст. (Я изучаю PHP и поставил себе такую задачу).
     
  14. titch

    titch Активный пользователь

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    тогда делайте проверки mb_check_encoding. как пользоваться iconv в курсе?