Серожа (ckayt) wrote,
Серожа
ckayt

PHP: Если очень-очень надо конвертировать UTF-8 в Windows-1251

Если очень-очень надо конвертировать UTF-8 в Windows-1251 без потерь и дозволяется использование html-сущностей, то вот она - магическая функция в моем исполнении:

function uft8_to_cp2151($text, $html = true){
	$etext = '';
	
	$oe = error_reporting();
	@error_reporting($oe ^ E_NOTICE);
	
	$ent_flags = ENT_COMPAT | (defined('ENT_HTML401') ? ENT_HTML401 : 0);
	
	for($i = 0; $i < mb_strlen($text, 'UTF-8'); $i++){
	
		$c = mb_substr($text, $i, 1, 'UTF-8');
		
		if(!$html){
			$etext .= mb_convert_encoding($c, 'cp1251', 'UTF-8');
			continue;
		}
		
		$ec = @iconv('utf-8', 'windows-1251', $c);
	
		if($ec === false || $ec === '' || strlen($ec) > 1){
			$ec = htmlentities(
				$c,
				$ent_flags,
				'UTF-8'
			);
	
			if(strlen($ec) > 1 && $ec[0] !== '&'){
				
				$jc = json_encode($c);
				
				$ec = preg_replace(
					'#^"\x5Cu0*([a-f0-9]+)"$#',
					'&#x\1;',
					$jc,
					-1,
					$cr
				);
				
				if(!$cr){
					throw new Exception('Can not decode character '.$jc);
				}
				
			}
		}
	
		$etext .= $ec;
	
	}
	
	@error_reporting($oe);
	
	return $etext;
}
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

  • 0 comments