Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Dany X

[Resolvido] Apanhando da Caixa de César

Recommended Posts

Porque o seguinte código destrói os acentos?

<?PHP
if ($_POST['phrase']!=''){
	$str = str_replace(" ", "", $_POST['phrase']);
	$str_l = strlen($str);
	$side = sqrt($str_l);
	$side = ceil($side);
	echo $str."<br />";
	
	for ($i=1; $i<=$side; $i++){
		$linhas[$i] = substr($str,($i-1)*$side,$side);
		echo "LINHA $i ->".(($i-1)*$side)." = ".$linhas[$i]."<br />";
	}
	for ($i=1; $i<=$side; $i++){
		for ($j=1; $j<=$side; $j++){
			$enc .= substr($linhas[$j],($i-1),1);
			//echo "ADD char ".substr($linhas[$j],($i-1),1)."<br />";
		}
	}

	$enc = $enc;
	echo 'A frase <b>'.$_POST['phrase'].'</b> encriptada com a caixa de César dá:<br />'.$enc;
}
?>

Veja em ação aqui:

http://opencloud.comze.com/sandbox/caesar/index.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

a função substr não é "multi-byte safe"

 

utilize mb_substr

 

 

nesses trechos

 

$linhas[$i] = substr($str,($i-1)*$side,$side);

$enc .= substr($linhas[$j],($i-1),1);

 

troque por

$linhas[$i] = mb_substr($str,($i-1)*$side,$side);

$enc .= mb_substr($linhas[$j],($i-1),1);

Compartilhar este post


Link para o post
Compartilhar em outros sites

...
	for ($i=1; $i<=$side; $i++){
		$linhas[$i] = mb_substr($str,($i-1)*$side,$side);
		echo "LINHA $i ->".(($i-1)*$side)." = ".$linhas[$i]."<br />";
	}
	for ($i=1; $i<=$side; $i++){
		for ($j=1; $j<=$side; $j++){
			$enc .= mb_substr($linhas[$j],($i-1),1);
			//echo "ADD char ".substr($linhas[$j],($i-1),1)."<br />";
		}
	}
	...

Ainda não funciona (já está online a nova versão).

Compartilhar este post


Link para o post
Compartilhar em outros sites

retorna algum erro ?

 

ou está retornando o mesmo resultado anterior?

 

fiz um teste usando

 

áéí

e outro teste usando a palavra

ação

 

ambos foram bem-sucedidos

 

 

no script, há também outra função que também pode comprometer a identificação dos caracteres

 

a função strlen também não é "multi-byte safe"

 

tente trocar strlen pela função equivalente da lista de funções mbstring

 

mb_strlen

http://www.php.net/manual/pt_BR/function.mb-strlen.php

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não testei, você disse que a palavra ação funciona no FF, no chrome aparece isso:

a�ã�o

Quando deveria aparecer:

aãço

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.