За последние 24 часа нас посетили 17644 программиста и 1721 робот. Сейчас ищут 994 программиста ...

Проблема с кодировкой

Тема в разделе "PHP для новичков", создана пользователем viphost, 14 июн 2009.

  1. viphost

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

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    Не пойму в чем дело [​IMG]
    Как такое может быть, я в базе данных менял кодировку на сайте менял, ничего понять не могу.
    Сейчас на сайте и в базе данных стоит кодировка UTF-8, помогите разобраться.
    На всякий случай выкладываю фаил отвечающий за этот текст:
    PHP:
    1. {php}
    2.     function insert_cutText($array){
    3.         $text = @$array["un"]["name"];
    4.         $size = @$array["un"]["size"];
    5.         $useDot = @$array["un"]["useDot"];
    6.         $useDot == "" ? $useDot = true : $useDot = false ;
    7.         $size == "" ? $size = 35 : $size = $size ;
    8.         $dot = "";
    9.         if ($useDot == "true"){$dot = "...";}
    10.         if ((strlen($text)-1) <=  $size){
    11.             $dot = "";
    12.         }
    13.         return substr($text,0,$size).$dot;
    14.     }
    15.    
    16.     function insert_cutTextDesc($array){
    17.    
    18.         $text = @$array["un"]["descrip"];
    19.         $size = @$array["un"]["size"];
    20.         $useDot = @$array["un"]["useDot"];
    21.         $useDot == "" ? $useDot = true : $useDot = false ;
    22.         $size == "" ? $size = 70 : $size = $size ;
    23.         $dot = "";
    24.         if ($useDot == "true"){$dot = "...";}
    25.         if ((strlen($text)-1) <=  $size){
    26.             $dot = "";
    27.         }
    28.         return substr($text,0,$size).$dot;
    29.     }
    30. {/php}
    Здесь function insert_cutTextDesc($array) тоже пробывал по всякому код редактить, но как я в этом, очень далекий человек, следовательно ничего не получилось. Хотел сделать чтобы текст урезался не по каличеству символов, а по словам, т.е. чтобы выводил 5-6 слов не более.
     
  2. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    utf-8 содержит символы так, что на некоторые уходит не 1, а 2 байта. На русский уходлит два, да. Поэтому запись
    PHP:
    1. <?
    2. $text = 'Пи';
    3. echo $text[0];
    вернёт не "П", а половину "П" - первый байт этой буквы. А в браузере это будет выглядеть как знак вопроса в чёрном квадрате. Как у тебя на скриншоте, ага.

    PHP:
    1. <?
    2. // [url=http://nudnik.ru/entry/1125]http://nudnik.ru/entry/1125[/url]
    3. function truncate($string, $len = 150){
    4.     preg_match('/.{1,'.$len.'}[^.!;?]*[.!;?]/si', trim(strip_tags($string)).'. ', $match);
    5.     return $match[0];
    6. }
    Моё (какбэ) для обрезки предложений в т.ч. и юникодовой:
    PHP:
    1. <?
    2. $longtext = 'Мама мыла раму, и мыла, и мыла, и мыла... блин, не мама, а домработница.';
    3. echo truncate($longtext, 10); // обрезаем на 10 символов, в реальности обрежится на 14, то есть до первого знака препинания
    А самый простой способ, когда ты точно знаешь, что текст русский или английский, то переведи текст чеез iconv() в windows-1251, а на выходе обратно в utf-8.
     
  3. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    И ещё. Забыл.

    Для utf-8 используй библиотеку mbstring. Обычно она стоит на хостинге. То есть используй ms_substr() вместо substr() и mb_strlen() вместо strlen().

    Ты можешь прописать в .htaccess или php.ini чтобы функции mbstring сами подменяли обычные текстовые функции.

    Короче, читай на http://ru.php.net/mbstring и в интернете, да. Тема в целом очень геморойная, но ознакомится стоит. :)
     
  4. viphost

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

    С нами с:
    23 мар 2009
    Сообщения:
    307
    Симпатии:
    0
    lexa
    Спасибо конечно, но что я понял из твоего поста это только то что буква режется попалам и поэтому квадратик с вопросиком. Я в php очень туго, только хочу начать учить, справочник есть, только руки не доходят :) . Не пойму того что мне надо сделать чтобы это пропало, как я понял
    PHP:
    1.  
    2. #          $text = @$array["un"]["name"];   -$text выводит название моей новости
    3. #          $size = @$array["un"]["size"];     -$size выводит описание моей новости
    Вот это обрезает текст после 70 символов
    PHP:
    1. $size == "" ? $size = 70 : $size = $size ;
    Какой код нужно заменить, чтобы было счастье :)

    Фаил php.ini у меня на сервере лежить, думаю с этим я разберусь. А вот с текстом этим и квадратом, для меня все очень сложно :).
     
  5. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    viphost, второй абзац моего второго поста: Для utf-8 используй библиотеку mbstring. Обычно она стоит на хостинге. То есть используй ms_substr() вместо substr() и mb_strlen() вместо strlen().

    Используй функции ms_substr() вместо substr() и mb_strlen() вместо strlen() при работе с utf-8 и будет счастье.

    Вот решение для копирования и вставления. Замени этим кодом вой код в обеих функциях.

    Замени это:
    PHP:
    1. <?
    2. if ($useDot == "true"){$dot = "...";}
    3. if ((strlen($text)-1) <=  $size){
    4.     $dot = "";
    5. }
    6. return substr($text,0,$size).$dot;
    на это:
    PHP:
    1. <?
    2. $text = iconv('utf-8', 'windows-1251', $text);
    3.  
    4. if ($useDot == "true"){$dot = "...";}
    5. if ((strlen($text)-1) <=  $size){
    6.     $dot = "";
    7. }
    8.  
    9. $text = substr($text,0,$size).$dot;
    10.  
    11. return iconv('windows-1251', 'utf-8', $text);
    P.S. Как чайник в php ты напрасно схватился с utf-8, как я заметил, это гемморойная вещица.
     
  6. Trojan

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

    С нами с:
    16 ноя 2009
    Сообщения:
    5
    Симпатии:
    0
    Адрес:
    Ташкент
    Ребята извиняюсь если не в тему, помогите пожалуйста с кодировкой. Создаю вот такой код (для примера):

    HTML:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4. <title>Соединяемся с БД</title>
    5. </head>
    6.  
    7.  
    8. <?php
    9.  
    10. $db = mysql_connect("localhost","trojan","password");
    11. mysql_select_db("firstbd",$db);
    12.  
    13. $result = mysql_query ("INSERT INTO firma (name,lastname,position) VALUES
    14. ('Сергей','Семак','Грузчик')");
    15.  
    16. if ($result == 'true')
    17. {
    18. echo "Информация в базу добавлена успешно!";
    19. }
    20. else
    21. {
    22. echo "Информация в базу не добавлена!";
    23. }
    24.  
    25. ?>
    26.  
    27. </body>
    28. </html>
    Получается так что, то что изначально было введено в MySQL отображается нормально, а то что прописывается в коде и добавляется в MySQL через DreamWeaver (хотя DreamWeaver тут наверно ни при чем) идет кракозябрами.

    [​IMG]

    [​IMG]

    Как такая проблема решается?
     
  7. Simpliest

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

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    У тебя по какой-то причине не срабатывает строка

    HTML:
    1. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    и ты получаешь страницу в 1251
     
  8. Phantik

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

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    2 Trojan

    1) Добавь в самый верх скрипта:
    <?php header('Content-type: text/html; charset=utf-8'); ?>

    2) Проверь что сам файл скрипта сохранен в utf-8

    3) Перед INSERT-ом в базу вставь mysql_query ("SET NAMES utf8");
     
  9. Trojan

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

    С нами с:
    16 ноя 2009
    Сообщения:
    5
    Симпатии:
    0
    Адрес:
    Ташкент
    Сделал так:

    HTML:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html xmlns="http://www.w3.org/1999/xhtml">
    3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    4. <title>Соединяемся с БД</title>
    5. </head>
    6.  
    7.  
    8. <?php header('Content-type: text/html; charset=utf-8');
    9.  
    10. $db = mysql_connect("localhost","trojan","password");
    11. mysql_select_db("firstbd",$db);
    12.  
    13. $result = mysql_query ("INSERT INTO firma (name,lastname,position) VALUES
    14. ('Сергей','Семак','Грузчик')");
    15.  
    16. if ($result == 'true')
    17. {
    18. echo "Информация в базу добавлена успешно!";
    19. }
    20. else
    21. {
    22. echo "Информация в базу не добавлена!";
    23. }
    24.  
    25. ?>
    26.  
    27. </body>
    28. </html>
    но: а) не срабатывает скрипт и б) идут точно такие же краки.
     
  10. Phantik

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

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Я не совсем точно выразился. Не в начало скрипта а в начало файла.
    <?php header('Content-type: text/html; charset=utf-8'); ?>
    <!DOCTYPE html...>
    .....

    В какой кодировке сохранен файл скрипта? Точно в utf-8?

    Ты не вставил mysql_query ("SET NAMES utf8"); перед INSERT-ом
     
  11. Roman82

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

    С нами с:
    26 ноя 2008
    Сообщения:
    101
    Симпатии:
    0
    Может быть это тебе поможет:

    у вас показываются "?????" вместо слов. Нужно сделать следующие:
    1. При закачивании вашей базы данных выберите нужную вам "Кодировку файла". Сделать вы этом можете в PhpMyAdmin на странице SQL, нижняя строчка, напротив кнопки "Пошел".
    2. Впишите в вашем скрипте, в файле который управляет базой данных, следующий код:

    mysql_query ("set character_set_client='cp1251'");
    mysql_query ("set character_set_results='cp1251'");
    mysql_query ("set collation_connection='cp1251_general_ci'");

    Этот код нужно вписывать сразу же после открытия базы данных.
     
  12. Trojan

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

    С нами с:
    16 ноя 2009
    Сообщения:
    5
    Симпатии:
    0
    Адрес:
    Ташкент
    Вот это помогло, текст русский отображается нормально, но теперь в таблице сдвинулись строки:

    [​IMG] [​IMG]

    Это в какую сторону копать?

    И еще можно ли как то решить вопрос кодировки по другому чтобы не вбивать каждый раз в начало файла строку <?php header('Content-type: text/html; charset=utf-8'); ?>. ?
     
  13. Phantik

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

    С нами с:
    2 июл 2009
    Сообщения:
    163
    Симпатии:
    0
    Ну то что в таблице строки сдвигаются это к дизайну-верстке вопрос.

    А чем тебе так мешает эта строка в начале скрипта? Да, браузеру нужно указывать кодировку страницы что бы не было проблем с отображением иероглифов.
     
  14. mrbig66

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

    С нами с:
    24 ноя 2009
    Сообщения:
    17
    Симпатии:
    0
    Адрес:
    msk
    Trojan
    А если будешь юзать mb_..... функции, то в начале надо указать

    PHP:
    1. <?php
    2.  
    3.  
    4. ?>
    5.