Da come hai detto che ti capita il problema, non penso sia colpa di JavaScript ma di PHP. Quando passi un valore tramite query string (per intenderci, col metodo GET), PHP fa una "traduzione" di alcuni caratteri o combinazioni di caratteri. Bisognerebbe forse vedere le impostazioni di php.ini sul server (non ricordo se tra le impostazioni ce ne siano che stabiliscono come devono essere trattate le stringhe passate via query string). Cmq per fare qualche prova, controlla prima di tutto il charset che usi nella pagina HTML (il meta tag Content-Type nella sezione head). Dovrebbe essere così:
Questo ti assicura che la pagina usi come codifica del carattere l'ISO Latin 1.codice:<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Poi, quando stampi il contenuto dell'indice cognome dell'array $_GET, penso tu possa tranquillamente evitare gli apici (cognome è il nome dell'indice) e quindi scrivere:
Per farti un esempio, io una volta passai in query string una stringa contenente un apice. Ovviamente la passai con il carattere di escape per l'apice (\'). PHP, ogni volta che la passavo, ci aggiungeva \ davanti! Dopo 4 volte che la passavo, avevo l'apice scritto nella pagina come: \\\\\'.codice:echo $_GET[cognome];
Quando fai il submit del form, prova a passare per una variabile PHP che "ricodifichi" la stringa. Potresti usare le funzioni urlencode() (anche due volte, una dentro l'altra), stripslashes(), htmlentities() (con il parametro ENT_QUOTES), ecc. Consulta http://www.php.net se non conosci qualcuna di queste funzioni. L'unica cosa che mi pare strana è che ti sostituisca una coppia di caratteri come "de"...per questo penso sia un problema di codifica dei caratteri a livello della pagina.