Конвертация текста win1251 в UTF-8

Тема в разделе "PHP", создана пользователем the_stalker, 12 апр 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. the_stalker

    the_stalker Постоялец

    Регистр.:
    19 фев 2007
    Сообщения:
    116
    Симпатии:
    3
    Сидел игрался с iconv() нихера не получается
    нужно писать собственную функцию?
     
  2. booch

    booch Постоялец

    Регистр.:
    26 ноя 2007
    Сообщения:
    108
    Симпатии:
    14
    У меня как раз iconv и помог решить все проблемы, связанные с utf8.
    $data = iconv("windows-1251", "UTF-8", $buf);
    И всё работает
     
  3. the_stalker

    the_stalker Постоялец

    Регистр.:
    19 фев 2007
    Сообщения:
    116
    Симпатии:
    3
    вот я лошара!
    Я писал win-1251 поэтому и не работало
    Проблема решена.
     
  4. Trezub

    Trezub Создатель

    Регистр.:
    27 дек 2007
    Сообщения:
    16
    Симпатии:
    0
    у меня со стандартными как-то не получилось,
    можно эту функцию использовать

    Код:
    function CP1251toUTF8($string){
      $out = '';
      for ($i = 0; $i<strlen($string); ++$i){
       $ch = ord($string{$i});
       if ($ch < 0x80) $out .= chr($ch);
       else
         if ($ch >= 0xC0)
           if ($ch < 0xF0)
                 $out .= "\xD0".chr(0x90 + $ch - 0xC0); // А-Я, а-п (A-YA, a-p)
           else $out .= "\xD1".chr(0x80 + $ch - 0xF0); // р-я (r-ya)
         else
           switch($ch){
             case 0xA8: $out .= "\xD0\x81"; break; // YO
             case 0xB8: $out .= "\xD1\x91"; break; // yo
             // ukrainian
             case 0xA1: $out .= "\xD0\x8E"; break; // Ў (U)
             case 0xA2: $out .= "\xD1\x9E"; break; // ў (u)
             case 0xAA: $out .= "\xD0\x84"; break; // Є (e)
             case 0xAF: $out .= "\xD0\x87"; break; // Ї (I..)
             case 0xB2: $out .= "\xD0\x86"; break; // I (I)
             case 0xB3: $out .= "\xD1\x96"; break; // i (i)
             case 0xBA: $out .= "\xD1\x94"; break; // є (e)
             case 0xBF: $out .= "\xD1\x97"; break; // ї (i..)
             // chuvashian
             case 0x8C: $out .= "\xD3\x90"; break; // Ӑ (A)
             case 0x8D: $out .= "\xD3\x96"; break; // Ӗ (E)
             case 0x8E: $out .= "\xD2\xAA"; break; // Ҫ (SCH)
             case 0x8F: $out .= "\xD3\xB2"; break; // Ӳ (U)
             case 0x9C: $out .= "\xD3\x91"; break; // ӑ (a)
             case 0x9D: $out .= "\xD3\x97"; break; // ӗ (e)
             case 0x9E: $out .= "\xD2\xAB"; break; // ҫ (sch)
             case 0x9F: $out .= "\xD3\xB3"; break; // ӳ (u)
           }
      }
      return $out;
    }	
    
     
  5. masto

    masto Прохожие

    а потом голову себе ломать, почему ImageMagic на русском не пишет и т.п.
    Есть iconv, который прекрасно справляется с конвертацией. зачем изголяться?
     
  6. Trezub

    Trezub Создатель

    Регистр.:
    27 дек 2007
    Сообщения:
    16
    Симпатии:
    0
    Я уже не помню почему, но когда-то у меня не получилось со стандартными функциями... а может я о них просто не знал?...

    Впрочем, как альтернативный способ, почему бы и нет.
     
  7. Tretiy

    Tretiy Постоялец

    Заблокирован
    Регистр.:
    10 дек 2007
    Сообщения:
    81
    Симпатии:
    9
    Та же история, даже по-моему хостер порубил функцию.
    И мне очень пригодилась самописання фукнция. Только у меня она чуть проще кажется
    PHP:
    function win_to_utf($s){
        for(
    $i=0$m=strlen($s); $i<$m$i++){
            
    $c=ord($s[$i]);
            if (
    $c<=127){
                
    $t.=chr($c); continue;
            }
            if (
    $c>=192 && $c<=207){
                
    $t.=chr(208).chr($c-48); continue;
            }
            if (
    $c>=208 && $c<=239){
                
    $t.=chr(208).chr($c-48); continue;
            }
            if (
    $c>=240 && $c<=255){
                
    $t.=chr(209).chr($c-112); continue;
            }
            if (
    $c==184) {
                
    $t.=chr(209).chr(209);
                continue;
            };
            if (
    $c==168) {
                
    $t.=chr(208).chr(129);
                continue;
            };
        }
        return 
    $t;
    }


    Добавлено через 43 секунды
    И если кому нужно, есть обратная:
    PHP:
    function utf_to_win($str,$to "w") {
        
    $outstr=\;
        
    $recode=array();
        
    $recode[k]=array(
        
    0x2500,0x2502,0x250c,0x2510,0x2514,0x2518,0x251c,0x2524,
        
    0x252c,0x2534,0x253c,0x2580,0x2584,0x2588,0x258c,0x2590,
        
    0x2591,0x2592,0x2593,0x2320,0x25a0,0x2219,0x221a,0x2248,
        
    0x2264,0x2265,0x00a0,0x2321,0x00b0,0x00b2,0x00b7,0x00f7,
        
    0x2550,0x2551,0x2552,0x0451,0x2553,0x2554,0x2555,0x2556,
        
    0x2557,0x2558,0x2559,0x255a,0x255b,0x255c,0x255d,0x255e,
        
    0x255f,0x2560,0x2561,0x0401,0x2562,0x2563,0x2564,0x2565,
        
    0x2566,0x2567,0x2568,0x2569,0x256a,0x256b,0x256c,0x00a9,
        
    0x044e,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433,
        
    0x0445,0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,
        
    0x043f,0x044f,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432,
        
    0x044c,0x044b,0x0437,0x0448,0x044d,0x0449,0x0447,0x044a,
        
    0x042e,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413,
        
    0x0425,0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,
        
    0x041f,0x042f,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412,
        
    0x042c,0x042b,0x0417,0x0428,0x042d,0x0429,0x0427,0x042a
        
    );
        
    $recode[w]=array(
        
    0x0402,0x0403,0x201A,0x0453,0x201E,0x2026,0x2020,0x2021,
        
    0x20AC,0x2030,0x0409,0x2039,0x040A,0x040C,0x040B,0x040F,
        
    0x0452,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,
        
    0x0000,0x2122,0x0459,0x203A,0x045A,0x045C,0x045B,0x045F,
        
    0x00A0,0x040E,0x045E,0x0408,0x00A4,0x0490,0x00A6,0x00A7,
        
    0x0401,0x00A9,0x0404,0x00AB,0x00AC,0x00AD,0x00AE,0x0407,
        
    0x00B0,0x00B1,0x0406,0x0456,0x0491,0x00B5,0x00B6,0x00B7,
        
    0x0451,0x2116,0x0454,0x00BB,0x0458,0x0405,0x0455,0x0457,
        
    0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,
        
    0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
        
    0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,
        
    0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
        
    0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,
        
    0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
        
    0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,
        
    0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F
        
    );
        
    $recode[i]=array(
        
    0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,
        
    0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
        
    0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,
        
    0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
        
    0x00A0,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407,
        
    0x0408,0x0409,0x040A,0x040B,0x040C,0x00AD,0x040E,0x040F,
        
    0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,
        
    0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
        
    0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,
        
    0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
        
    0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,
        
    0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
        
    0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,
        
    0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F,
        
    0x2116,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,
        
    0x0458,0x0459,0x045A,0x045B,0x045C,0x00A7,0x045E,0x045F
        
    );
        
    $recode[a]=array(
        
    0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,
        
    0x0418,0x0419,0x041a,0x041b,0x041c,0x041d,0x041e,0x041f,
        
    0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,
        
    0x0428,0x0429,0x042a,0x042b,0x042c,0x042d,0x042e,0x042f,
        
    0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,
        
    0x0438,0x0439,0x043a,0x043b,0x043c,0x043d,0x043e,0x043f,
        
    0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556,
        
    0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510,
        
    0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f,
        
    0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567,
        
    0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b,
        
    0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580,
        
    0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,
        
    0x0448,0x0449,0x044a,0x044b,0x044c,0x044d,0x044e,0x044f,
        
    0x0401,0x0451,0x0404,0x0454,0x0407,0x0457,0x040e,0x045e,
        
    0x00b0,0x2219,0x00b7,0x221a,0x2116,0x00a4,0x25a0,0x00a0
        
    );
        
    $recode[d]=$recode[a];
        
    $recode[m]=array(
        
    0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,
        
    0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
        
    0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,
        
    0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
        
    0x2020,0x00B0,0x00A2,0x00A3,0x00A7,0x2022,0x00B6,0x0406,
        
    0x00AE,0x00A9,0x2122,0x0402,0x0452,0x2260,0x0403,0x0453,
        
    0x221E,0x00B1,0x2264,0x2265,0x0456,0x00B5,0x2202,0x0408,
        
    0x0404,0x0454,0x0407,0x0457,0x0409,0x0459,0x040A,0x045A,
        
    0x0458,0x0405,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,
        
    0x00BB,0x2026,0x00A0,0x040B,0x045B,0x040C,0x045C,0x0455,
        
    0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x201E,
        
    0x040E,0x045E,0x040F,0x045F,0x2116,0x0401,0x0451,0x044F,
        
    0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,
        
    0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
        
    0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,
        
    0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x00A4
        
    );
        
    $and=0x3F;
        for (
    $i=0;$i<strlen($str);$i++) {
            
    $letter=0x0;
            
    $octet=array();
            
    $octet[0]=ord($str[$i]);
            
    $octets=1;
            
    $andfirst=0x7F;
            if ((
    $octet[0]>>1)==0x7E) {
            
    $octets=6;
            
    $andfirst=0x1;
            } elseif ((
    $octet[0]>>2)==0x3E) {
            
    $octets=5;
            
    $andfirst=0x3;
            } elseif ((
    $octet[0]>>3)==0x1E) {
            
    $octets=4;
            
    $andfirst=0x7;
            } elseif ((
    $octet[0]>>4)==0xE) {
            
    $octets=3;
            
    $andfirst=0xF;
            } elseif ((
    $octet[0]>>5)==0x6) {
            
    $octets=2;
            
    $andfirst=0x1F;
            }
            
    $octet[0]=$octet[0] & $andfirst;
            
    $octet[0]=$octet[0] << ($octets-1)*6;
            
    $letter+=$octet[0];
            for (
    $j=1;$j<$octets;$j++) {
            
    $i++;
            
    $octet[$j]=ord($str[$i]) & $and;
            
    $octet[$j]=$octet[$j] << ($octets-1-$j)*6;
            
    $letter+=$octet[$j];
            }
                if (
    $letter<0x80) {
                    
    $outstr.=chr($letter);
            } else {
            if (
    in_array($letter,$recode[$to])) {
                    
    $outstr.=chr(array_search($letter,$recode[$to])+128);
            }
            }
        }
        return(
    $outstr);
    }
     
    Rat и Юрик нравится это.
  8. Dmitry_Pascal

    Dmitry_Pascal Создатель

    Регистр.:
    25 апр 2009
    Сообщения:
    24
    Симпатии:
    0
    Сегодня вот промучался,
    функция simplexml_load_file() не хочет брать файлы с кодировкой не UTF

    Перекодировал так: $file = iconv('windows-1251', 'utf-8//IGNORE', $file);
    Старнно, но //IGNORE- не поомг.

    Ошибка:
    PHP Warning: simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: /tmp/gameq.xml:60: parser error : PCDATA invalid Char value 4 in /usr/local/www/www/stat/gameq.php on line 20

    Не нравится ему "invalid Char value 4"
    Пришлось взять выше упомянутую функцию win_to_utf($s){
    И добавить строчки
    if ($c==4) {
    <------> $t.=''; continue;
    };

    Хотя подозреваю что это тоже неверно, т.к. символов, которые не переваривает simplexml_load_file намного больше.
     
  9. noiz

    noiz Создатель

    Регистр.:
    9 апр 2009
    Сообщения:
    16
    Симпатии:
    1
    как вариант можно использовать
    Код:
    $str = mb_convert_encoding($str, "UTF-8", "windows-1251");
    
    вообще набор функций mbstring очень полезен для работы с UTF-8
     
  10. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    591
    Для использования mb_convert_encoding() нужен модуль mbstring.
    Для использования iconv() нужен модуль iconv.
     
Статус темы:
Закрыта.