Перекодировние в UTF8

Статус
В этой теме нельзя размещать новые ответы.

LEXAlForpostl

Мой дом здесь!
Регистрация
21 Май 2008
Сообщения
766
Реакции
228
Здравствуйте.
В переменной $text, текст неизвестной кодировки.
Можно ли как-то перекодировать его в UTF8, не зная кодировку, и учитывая то, что кодировка уже может быть UTF8.
 
например если точно известно, что текст на русском, то можно перекодировать из списка кодировок в утф и посмотреть есть ли в перекодированном тексте кириллица, если есть значит кодировка найдена.
PHP:
//$test = file_get_contents('test2.txt');
$test = "текст непонятный";
if(preg_match('/[а-яё]+$/iu', $test)){
    echo "кодировка:UTF-8<br>";
}else{
    
    $c = array("UTF-8", "ASCII", "Windows-1251", "ISO-8859-1");
    $text = "";
    foreach ($c as $i){
        $text_new = iconv($i, "UTF-8", $test);
        $text .= $i."->UTF-8:".$text_new."<br>";
        if (preg_match('/[а-яё]+$/iu', $text_new)){
            echo "кодировка:".$i."<br>";
        }
    }
    
    echo $text;
}
 
Можно проще открываешь свой скрипт в Notepad ++ и сохраняешь в кодировке utf-8 без без BOM:)
 
я для этого использую dreamweaver с ним проблем никогда нет. Всегда сохранял из любой кодировки в utf нормально
 
а еще есть классная штучка:
PHP:
mb_convert_variables('utf8', 'auto', $text);
но перед этим проверяем чтобы модуль mbstring был установлен в пхп
 
я так себе помогаю;)
например:cp-1251 -> в utf-8
PHP:
mb_internal_encoding('utf-8');
 $work_ut = file_get_contents("baza_name.sql");
 $work_ut = mb_convert_encoding($work_ut, 'utf-8', 'cp-1251');
 file_put_contents ("baza_name.sql", $work_ut)
 
я так себе помогаю;)
например:cp-1251 -> в utf-8
PHP:
mb_internal_encoding('utf-8');
 $work_ut = file_get_contents("baza_name.sql");
 $work_ut = mb_convert_encoding($work_ut, 'utf-8', 'cp-1251');
 file_put_contents ("baza_name.sql", $work_ut)
А читать ТС не пробовал?
Ведь задача четко стоит перекодировать из неизвестной колировки...
PS Да и вообще чем iconv не устраивает?
 
как вариант, если нет, то, что-то умное придумывать и сравнивать несколько кодировок...


$subject = "abcdefывапывапыв"; // Ваша строка
$pattern = '/[а-яА-Я]+/'; // шаблон
preg_match($pattern, $subject, $matches);
if ( sizeof($matches) >0 ) {
//есть кириллица
}
 
И чё?
Кириллица может быть минимум в 4-х кодировках.
Да и регулярка левая - не выкупит кирилицу в юникоде.
 
вот еще откопал на винте интересный вариант...

PHP:
define('LOWERCASE',3);
   define('UPPERCASE',1);
   function detect_cyr_charset($str) {
       $charsets = Array(
                         'k' => 0,
                         'w' => 0,
                         'd' => 0,
                         'i' => 0,
                         'm' => 0
                         );
       for ( $i = 0, $length = strlen($str); $i < $length; $i++ ) {
           $char = ord($str[$i]);
           //non-russian characters
           if ($char < 128 || $char > 256) continue;

           //CP866
           if (($char > 159 && $char < 176) || ($char > 223 && $char < 242))
               $charsets['d']+=LOWERCASE;
           if (($char > 127 && $char < 160)) $charsets['d']+=UPPERCASE;

           //KOI8-R
           if (($char > 191 && $char < 223)) $charsets['k']+=LOWERCASE;
           if (($char > 222 && $char < 256)) $charsets['k']+=UPPERCASE;

           //WIN-1251
           if ($char > 223 && $char < 256) $charsets['w']+=LOWERCASE;
           if ($char > 191 && $char < 224) $charsets['w']+=UPPERCASE;

           //MAC
           if ($char > 221 && $char < 255) $charsets['m']+=LOWERCASE;
           if ($char > 127 && $char < 160) $charsets['m']+=UPPERCASE;

           //ISO-8859-5
           if ($char > 207 && $char < 240) $charsets['i']+=LOWERCASE;
           if ($char > 175 && $char < 208) $charsets['i']+=UPPERCASE;

       }
       arsort($charsets);
       return key($charsets);
   }
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху