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

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

the_stalker

Постоялец
Регистрация
19 Фев 2007
Сообщения
116
Реакции
5
Сидел игрался с iconv() нихера не получается
нужно писать собственную функцию?
 
У меня как раз iconv и помог решить все проблемы, связанные с utf8.
$data = iconv("windows-1251", "UTF-8", $buf);
И всё работает
 
вот я лошара!
Я писал win-1251 поэтому и не работало
Проблема решена.
 
у меня со стандартными как-то не получилось,
можно эту функцию использовать

Код:
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;
}
 
у меня со стандартными как-то не получилось,
можно эту функцию использовать

Код:
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;
}

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

Я уже не помню почему, но когда-то у меня не получилось со стандартными функциями... а может я о них просто не знал?...

Впрочем, как альтернативный способ, почему бы и нет.
 
  • Заблокирован
  • #7
Я уже не помню почему, но когда-то у меня не получилось со стандартными функциями... а может я о них просто не знал?...

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

Та же история, даже по-моему хостер порубил функцию.
И мне очень пригодилась самописання фукнция. Только у меня она чуть проще кажется
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);
}
 
Сегодня вот промучался,
функция 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 намного больше.
 
как вариант можно использовать
Код:
$str = mb_convert_encoding($str, "UTF-8", "windows-1251");

вообще набор функций mbstring очень полезен для работы с UTF-8
 
Для использования mb_convert_encoding() нужен модуль mbstring.
Для использования iconv() нужен модуль iconv.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху