Yo haría más o menos algo del estilo de:
Ejemplo C++
int restarINT = 'Ñ'-'N';
double restarDouble = static_cast<double>(restarINT) - 0.5;
if (caracter[i] == 'Ñ')
{
if( (static_cast<double>('Ñ') - restarDouble) > caracterComparar )
{
cout << "La Ñ va antes que la " << caracterComparar << endl;
}
else
{
cout << "La Ñ va despues que la " << caracterComparar << endl;
}
}
Aquí simplemente cuando se encuentra la Ñ le otorgas el número 18.5 que es mayor que 18(N) y menor que 19(O). Por lo que podrías ordenar la Ñ entre esas 2 letras.
Ejemplo PHP:
<?php
function SMTaD($cipherText)
{
$cipherTextTam = strlen($cipherText); $diccionario = array('a','b','c','d','e','f','g','h','i','j','k','l', 'm','n','ñ','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C',
'D','E','F','G','H','I','J','K','L','M','N','Ñ','O','P','Q','R','S',
'T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0','.',
':','/',' ');
$diccionarioTam = count($diccionario); $cipherTextDec = [];
$y = 0;
for($i = 0; $i < $cipherTextTam; ++$i)
{
for($x = 0; $x < $diccionarioTam; ++$x)
{
if($cipherText[$i] == $diccionario[$x])
{
$cipherTextDec[$y] = 1+$x;
++$y;
}
else
{
}
}
}
return $cipherTextDec;
}
Aquí creo un diccionario y obtengo su orden en el mismo.
Si metes tu abecedario como te de la gana obtendrás un array contiendo el orden de cada letra.
Después puedes ordenar cada caracter mirando el array (recorriendo caracteres y array con el mismo iterador.)
O puedes convertir los números del array en el caracter correspondiente añadiéndolos a un nuevo array o string.
Ejemplo de esto último en PHP:
function SMDaT($cipherText)
{
$cipherTextTam = count($cipherText); $diccionario = array('a','b','c','d','e','f','g','h','i','j','k','l', 'm','n','ñ','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C',
'D','E','F','G','H','I','J','K','L','M','N','Ñ','O','P','Q','R','S',
'T','U','V','W','X','Y','Z','1','2','3','4','5','6','7','8','9','0','.',
':','/','-','!','@','^','&','*','+','=','<','>','{','}','[',']','€','%','?','_','|',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','ñ','o','p','q','r','s',
't','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L',
'M','N','Ñ','O','P','Q','R','S','T','U','V','W','X','Y','Z'); $diccionarioTam = count($diccionario); $diccionario2 = array('1','2','3','4','5','6','7','8','9', '10','11','12','13','14','15','16','17','18','19','20','21',
'22','23','24','25','26','27','28','29','30','31','32','33',
'34','35','36','37','38','39','40','41','42','43','44','45',
'46','47','48','49','50','51','52','53','54','55','56','57',
'58','59','60','61','62','63','64','65','66','67','68','69',
'70','71','72','73','74','75','76','77','78','79','80','81',
'82','83','84','85','86','87','88','89','90','91','92','93',
'94','95','96','97','98','99','100','101','102','103',
'104','105','106','107','108','109','110','111','112',
'113','114','115','116','117','118','119','120','121',
'122','123','124','125','126','127','128','129','130',
'131','132','133','134','135','136','137','138','139');
$diccionario2Tam = count($diccionario2); $cipherTextText = [];
$z=0;
for($i = 0; $i < $cipherTextTam; ++$i)
{
for($x =0; $x<$diccionarioTam; ++$x)
{
if($cipherText[$i] == $diccionario2[$x])
{
$cipherTextText[$z] = $diccionario[$x];
++$z;
}
}
}
return $cipherTextText;
}
La logica de esto la puedes implementar en cualquier lenguaje.
Por si no entiendes bien lo que hacen las funciona de el PHP lo tengo muy comentado aquí:
https://github.com/StringManolo/SMDFPHC/blob/master/SMDFPHC.php