PHP: фукнции перекодировки UTF8-Win, Win-UTF8

Кракозябры

Иногда случаются такие моменты, когда в php нужно перекодировать данные из одной кодировки в другую. В этой заметке я приведу несколько функций, которыми я не раз пользовался.

Сразу скажу, копирайт не мой (сейчас уже неясно чей), но фукнции работают. Часто помогают при php-javascript взаимодействиях.

Итак, перекодировка из utf-8 в windows-1251 и обратно:

Функция первая из utf8 в cp1251:

function utf8_win1($s) {
$s=strtr($s,array("\xD0\xB0"=>"а", "\xD0\x90"=>"А", "\xD0\xB1"=>"б", "\xD0\x91"=>"Б",
 "\xD0\xB2"=>"в", "\xD0\x92"=>"В", "\xD0\xB3"=>"г", "\xD0\x93"=>"Г", "\xD0\xB4"=>"д",
 "\xD0\x94"=>"Д", "\xD0\xB5"=>"е", "\xD0\x95"=>"Е", "\xD1\x91"=>"ё", "\xD0\x81"=>"Ё",
 "\xD0\xB6"=>"ж", "\xD0\x96"=>"Ж", "\xD0\xB7"=>"з", "\xD0\x97"=>"З", "\xD0\xB8"=>"и",
 "\xD0\x98"=>"И", "\xD0\xB9"=>"й", "\xD0\x99"=>"Й", "\xD0\xBA"=>"к", "\xD0\x9A"=>"К",
 "\xD0\xBB"=>"л", "\xD0\x9B"=>"Л", "\xD0\xBC"=>"м", "\xD0\x9C"=>"М", "\xD0\xBD"=>"н",
 "\xD0\x9D"=>"Н", "\xD0\xBE"=>"о", "\xD0\x9E"=>"О", "\xD0\xBF"=>"п", "\xD0\x9F"=>"П",
 "\xD1\x80"=>"р", "\xD0\xA0"=>"Р", "\xD1\x81"=>"с", "\xD0\xA1"=>"С", "\xD1\x82"=>"т",
 "\xD0\xA2"=>"Т", "\xD1\x83"=>"у", "\xD0\xA3"=>"У", "\xD1\x84"=>"ф", "\xD0\xA4"=>"Ф",
 "\xD1\x85"=>"х", "\xD0\xA5"=>"Х", "\xD1\x86"=>"ц", "\xD0\xA6"=>"Ц", "\xD1\x87"=>"ч",
 "\xD0\xA7"=>"Ч", "\xD1\x88"=>"ш", "\xD0\xA8"=>"Ш", "\xD1\x89"=>"щ", "\xD0\xA9"=>"Щ",
 "\xD1\x8A"=>"ъ", "\xD0\xAA"=>"Ъ", "\xD1\x8B"=>"ы", "\xD0\xAB"=>"Ы", "\xD1\x8C"=>"ь",
 "\xD0\xAC"=>"Ь", "\xD1\x8D"=>"э", "\xD0\xAD"=>"Э", "\xD1\x8E"=>"ю", "\xD0\xAE"=>"Ю",
 "\xD1\x8F"=>"я", "\xD0\xAF"=>"Я"));
return $s;
}

Функция вторая из utf8 в cp1251:

function utf8_win($s) {
	$out = "";
	$c1 = "";
	$byte2 = false;
	for ($c = 0; $c < strlen($s); $c ++){
		$i = ord($s[$c]);
		if ($i <= 127) $out .= $s[$c];
		if ($byte2) {
			$new_c2 = ($c1 & 3) * 64 + ($i & 63);
			$new_c1 = ($c1 >> 2) & 5;
			$new_i = $new_c1 * 256 + $new_c2;
			if ($new_i == 1025){
				$out_i = 168;
			}else {
				if ($new_i == 1105){
					$out_i = 184;
				}else {
					$out_i = $new_i-848;
				}
			}
			$out .= chr($out_i);
			$byte2 = false;
		}
		if (($i >> 5) == 6) {
			$c1 = $i;
			$byte2 = true;
		}
	}
	return $out;
}

Функция перекодировки из windows-1251 в utf-8:

function win_utf8($in_text) { 
   $output = "";
   $other[1025] = "Ё";
   $other[1105] = "ё";
   $other[1028] = "Є";
   $other[1108] = "є";
   $other[1030] = "I";
   $other[1110] = "i";
   $other[1031] = "Ї";
   $other[1111] = "ї";
   for ($i = 0; $i < strlen($in_text); $i++){
      if (ord($in_text{$i}) > 191) {
         $output.="&#".(ord($in_text{$i})+848).";";
      }else {
         if (array_search($in_text{$i}, $other)===false){
            $output.=$in_text{$i};
         }else {
            $output.="&#".array_search($in_text{$i}, $other).";";
         }
      }
   }
   return $output;
}

Комментарии

Если бы еще пример для чайника - куда код вставить...

Если в переменной $text у нас текст в кодировке utf8, то применив нужную фукнцию:
$text = utf8_win($text)
мы получим в переменной $text текст в кодировке windows1251 :)

Спасибо огромное =) помогло. были проблемы с кодировкой при работе с rewriteengine

Спасибо за помощь!!! :)

Чувааааак, выручил. Сердечно жму твою виртуальную руку!!!!

Спасибо, это лучше, чем iconv (та почему-то иногда не срабатывает).

// Более удобный и полный вариант (правильно декодирующий знаки пуцнктуации и т.п.):
function utf2win($str,$type="w"){
static $conv;
if( !is_array($conv) ){
// ASCII 128 - 255
$conv['w'] = array(
"\x80","\x81","\x82","\x83","\x84","\x85","\x86","\x87","\x88","\x89","\x8a","\x8b","\x8c","\x8d","\x8e","\x8f",
"\x90","\x91","\x92","\x93","\x94","\x95","\x96","\x97","\x98","\x99","\x9a","\x9b","\x9c","\x9d","\x9e","\x9f",
"\xa0","\xa1","\xa2","\xa3","\xa4","\xa5","\xa6","\xa7","\xa8","\xa9","\xaa","\xab","\xac","\xad","\xae","\xaf",
"\xb0","\xb1","\xb2","\xb3","\xb4","\xb5","\xb6","\xb7","\xb8","\xb9","\xba","\xbb","\xbc","\xbd","\xbe","\xbf",
"\xc0","\xc1","\xc2","\xc3","\xc4","\xc5","\xc6","\xc7","\xc8","\xc9","\xca","\xcb","\xcc","\xcd","\xce","\xcf",
"\xd0","\xd1","\xd2","\xd3","\xd4","\xd5","\xd6","\xd7","\xd8","\xd9","\xda","\xdb","\xdc","\xdd","\xde","\xdf",
"\xe0","\xe1","\xe2","\xe3","\xe4","\xe5","\xe6","\xe7","\xe8","\xe9","\xea","\xeb","\xec","\xed","\xee","\xef",
"\xf0","\xf1","\xf2","\xf3","\xf4","\xf5","\xf6","\xf7","\xf8","\xf9","\xfa","\xfb","\xfc","\xfd","\xfe","\xff");
$conv['u'] = array(
"\xd0\x82","\xd0\x83","\xe2\x80\x9a","\xd1\x93","\xe2\x80\x9e","\xe2\x80\xa6","\xe2\x80\xa0","\xe2\x80\xa1","\xe2\x82\xac","\xe2\x80\xb0","\xd0\x89","\xe2\x80\xb9","\xd0\x8a","\xd0\x8c","\xd0\x8b","\xd0\x8f",
"\xd1\x92","\xe2\x80\x98","\xe2\x80\x99","\xe2\x80\x9c","\xe2\x80\x9d","\xe2\x80\xa2","\xe2\x80\x93","\xe2\x80\x94","","\xe2\x84\xa2","\xd1\x99","\xe2\x80\xba","\xd1\x9a","\xd1\x9c","\xd1\x9b","\xd1\x9f",
"\xc2\xa0","\xd0\x8e","\xd1\x9e","\xd0\x88","\xc2\xa4","\xd2\x90","\xc2\xa6","\xc2\xa7","\xd0\x81","\xc2\xa9","\xd0\x84","\xc2\xab","\xc2\xac","\xc2\xad","\xc2\xae","\xd0\x87",
"\xc2\xb0","\xc2\xb1","\xd0\x86","\xd1\x96","\xd2\x91","\xc2\xb5","\xc2\xb6","\xc2\xb7","\xd1\x91","\xe2\x84\x96","\xd1\x94","\xc2\xbb","\xd1\x98","\xd0\x85","\xd1\x95","\xd1\x97",
"\xd0\x90","\xd0\x91","\xd0\x92","\xd0\x93","\xd0\x94","\xd0\x95","\xd0\x96","\xd0\x97","\xd0\x98","\xd0\x99","\xd0\x9a","\xd0\x9b","\xd0\x9c","\xd0\x9d","\xd0\x9e","\xd0\x9f",
"\xd0\xa0","\xd0\xa1","\xd0\xa2","\xd0\xa3","\xd0\xa4","\xd0\xa5","\xd0\xa6","\xd0\xa7","\xd0\xa8","\xd0\xa9","\xd0\xaa","\xd0\xab","\xd0\xac","\xd0\xad","\xd0\xae","\xd0\xaf",
"\xd0\xb0","\xd0\xb1","\xd0\xb2","\xd0\xb3","\xd0\xb4","\xd0\xb5","\xd0\xb6","\xd0\xb7","\xd0\xb8","\xd0\xb9","\xd0\xba","\xd0\xbb","\xd0\xbc","\xd0\xbd","\xd0\xbe","\xd0\xbf",
"\xd1\x80","\xd1\x81","\xd1\x82","\xd1\x83","\xd1\x84","\xd1\x85","\xd1\x86","\xd1\x87","\xd1\x88","\xd1\x89","\xd1\x8a","\xd1\x8b","\xd1\x8c","\xd1\x8d","\xd1\x8e","\xd1\x8f");
}//if
if ($type == 'w') { return str_replace($conv['u'],$conv['w'],$str); }
elseif ($type == 'u') { return str_replace($conv['w'], $conv['u'],$str); }
else { return $str; }
}

в win_utf8 двоеточие неробит((

а че iconv на php функция уже не поддерживается?))

Видимо iconv для автора не кашерно)))