Ufa es verdad
Bueno, enviando al url la sentencia sql codificada para url deja de hacer cosas raras.
Debes alterar sólo esto en tu función js
Código:
function enviar(sql,titulos){
window.open('hoja_excel.php?sql='+escape(sql)+'&titulos='+titulos);
}
Creo que lo que estaba sucediendo es que al recoger el valor de la url confundía los %55 y similares con el urlencode. Así como los espacios los envía como %20 el %55 debía interpretarlo como otro caracter codificado.
Enviando el valor codificado directamente desde el javascript parece que se soluciona
dime si te funciona ok ahora