перекодировать строку

Тема в разделе "PHP", создана пользователем sunyang, 24 май 2011.

Модераторы: latteo
  1. sunyang

    sunyang

    Регистр.:
    25 апр 2009
    Сообщения:
    444
    Симпатии:
    30
    как строку, записанную так:
    Размер продукта: размер
    Бюст :80-90CM Длина: 80 см
    Материал: Хлопок
    Подкладка: Нет
    Гибкость: Да
    Другие аксессуары: Нет
    Происхождение: Китай

    перекодировать в нормальный вид?
     
  2. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Давай начнем с того откуда ты ее берешь?
     
  3. sunyang

    sunyang

    Регистр.:
    25 апр 2009
    Сообщения:
    444
    Симпатии:
    30
    вот от сюда:

    PHP:
    $opisanie "<br/>
     Product Size: Size
    <br/>
     Bust :80-90CM Length: 80CM
    <br/>
     Material: Cotton
    <br/>
     Lining: None
    <br/>
     Flexible: Yes
    <br/>
     Other accessories: None
    <br/>
     Origin: China"


    class Google_Translate_API {

            
    /**
             * Translate a piece of text with the Google Translate API
             * @return String
             * @param $text String
             * @param $from String[optional] Original language of $text. An empty String will let google decide the language of origin
             * @param $to String[optional] Language to translate $text to
             */
            
    function translate($text$from ''$to 'en') {
                    
    $url 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q='.rawurlencode($text).'&langpair='.rawurlencode($from.'|'.$to);
                    
    $response file_get_contents(
                            
    $url,
                            
    null,
                            
    stream_context_create(
                                    array(
                                            
    'http'=>array(
                                                    
    'method'=>"GET",
                                                    
    'header'=>"Referer: http://".$_SERVER['HTTP_HOST']."/\r\n"
                                            
    )
                                    )
                            )
                    );
                    if (
    preg_match("/{\"translatedText\":\"([^\"]+)\"/i"$response$matches)) {
                            return 
    self::_unescapeUTF8EscapeSeq($matches[1]);
                    }
                    return 
    false;
            }
            
            
    /**
             * Convert UTF-8 Escape sequences in a string to UTF-8 Bytes. Old version.
             * @return UTF-8 String
             * @param $str String
             */
            
    function __unescapeUTF8EscapeSeq($str) {
                    return 
    preg_replace_callback("/\\\u([0-9a-f]{4})/i"create_function('$matches''return html_entity_decode(\'&#x\'.$matches[1].\';\', ENT_NOQUOTES, \'UTF-8\');'), $str);
            }
            
            
    /**
             * Convert UTF-8 Escape sequences in a string to UTF-8 Bytes
             * @return UTF-8 String
             * @param $str String
             */
            
    function _unescapeUTF8EscapeSeq($str) {
                    return 
    preg_replace_callback("/\\\u([0-9a-f]{4})/i"create_function('$matches''return Google_Translate_API::_bin2utf8(hexdec($matches[1]));'), $str);
            }
            
            
    /**
             * Convert binary character code to UTF-8 byte sequence
             * @return String
             * @param $bin Mixed Interger or Hex code of character
             */
            
    function _bin2utf8($bin) {
                    if (
    $bin <= 0x7F) {
                            return 
    chr($bin);
                    } else if (
    $bin >= 0x80 && $bin <= 0x7FF) {
                            return 
    pack("C*"0xC0 $bin >> 60x80 $bin 0x3F);
                    } else if (
    $bin >= 0x800 && $bin <= 0xFFF) {
                            return 
    pack("C*"0xE0 $bin >> 110x80 $bin >> 0x3F0x80 $bin 0x3F);
                    } else if (
    $bin >= 0x10000 && $bin <= 0x10FFFF) {
                            return 
    pack("C*"0xE0 $bin >> 170x80 $bin >> 12 0x3F0x80 $bin >> 60x3F0x80 $bin 0x3F);
                    }
            }
            
    }



    $text "$opisanie";
    $trans_text Google_Translate_API::translate($text'en''ru');
    if (
    $trans_text !== false) {
    echo 
    $trans_text;
    }
    а вот в $trans_text уже в cp1251 переведенная стройка.

    Поэтому в базу $trans_text записывается кракозяблами.

    Как после перевода, преобразовать стору в utf8 ?
     
  4. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Ну у меня вот такая старенькая функция до сих пор используется.
    PHP:
        function to_utf($arr)
        {
            if (
    is_array($arr)) {
                foreach (
    $arr as $k => $v) {
                    
    $arr[$k] = $this->to_utf($v);
                }
            } else {
                
    $arr iconv('cp1251''utf-8'$arr);
            }
            return 
    $arr;
        }
     
  5. sunyang

    sunyang

    Регистр.:
    25 апр 2009
    Сообщения:
    444
    Симпатии:
    30
    А причем здесь проверка на массив?

    iconv('cp1251', 'utf-8', $arr); не хочет эту строку переводить.
     
  6. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Я привел функцию, которой пофиг что ей скармливаешь массив или нет. Случаи разные бывают. Мне нужно было для работы с json, когда сайт еще в cp1251 был...
     
  7. zzallexx

    zzallexx

    Регистр.:
    11 июн 2008
    Сообщения:
    1.036
    Симпатии:
    699
    а с чего ты вообще решил что тебе ее куда-то надо переводить строка то у тебя как-раз в утф из Гоши выходит просто делать это все надо в файле с кодировкой utf-8 и после подключения к базе прописать
    PHP:
    mysql_query ("set character_set_client='utf8'"); 
    mysql_query ("set character_set_results='utf8'");
    mysql_query ("set collation_connection='utf8_general_ci'");
    mysql_query("SET NAMES utf8");
    как тебе уже и советовали только в другой теме
     
    sunyang нравится это.
  8. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Стоп, а дебажить вообще пробовал? Вывод строки до записи в базу? Кодировка базы какая?
    zzallexx, практически всегда достаточно только set names.
     
  9. sunyang

    sunyang

    Регистр.:
    25 апр 2009
    Сообщения:
    444
    Симпатии:
    30
    да, проблема была с базой.

    помогло вот это:

    PHP:
    mysql_query ("set character_set_client='utf8'");  
    mysql_query ("set character_set_results='utf8'"); 
    mysql_query ("set collation_connection='utf8_general_ci'"); 
    mysql_query("SET NAMES utf8");