Personaggi nascosti in Mysql e come eliminarli e prevenirli?

Recentemente ho pubblicato una domanda riguardante i risultati incompleti in una query mysql ( vedi qui ).

Scavando e sperimentando molto ho scoperto che c'erano dei caratteri nascosti nei dati della tabella mysql a causa di problemi di codifica. Il personaggio principale nascosto che è apparso è stato un "personaggio spazio non-breaking", che ha mostrato un 'Â' quando ho codificato il valore del field di text in php, usando:

$mystring =utf8_encode($string); 

La mia prima preoccupazione ora era di liberarmi dei personaggi nascosti indesiderati nei dati mysql. Ho cercato StackOverflow e la soluzione migliore che ho trovato era qui , quindi eseguo questo codice:

 $link = mysqli_connect($strMSQLdomein, $strMSQLUserName, $strMSQLPass, $strMSQLDBName); $strSQLSource = "SELECT * FROM Nevo_Nutrient_Gehaltes WHERE Productcode > 0 ORDER BY Productcode ASC"; $resultSource = mysqli_query($link, $strSQLSource); if($resultSource){ while($rowSource = mysqli_fetch_assoc($resultSource)){ $lngCurProductcode = (int)$rowSource['Productcode']; $strCurProduct_omschrijving = $rowSource['Product_omschrijving']; $strCurProduct_omschrijving = preg_replace('/\p{C}+/u', '', $strCurProduct_omschrijving); $sql = "UPDATE Nevo_Nutrient_Gehaltes SET Product_omschrijving = '$strCurProduct_omschrijving' WHERE Productcode = $lngCurProductcode"; $result = mysqli_query($link, $sql); } } mysqli_close($link); 

Tuttavia, questo mi ha lasciato con campi di text vuoti ovunque ci fosse un personaggio nascosto in quel field di text. Certo che non va bene!

Quindi la mia prima domanda è: perché questo codice lascia una string vuota?

Poiché il personaggio principale del problema è il "carattere spazio non frazionante", ho creato un arround di lavoro per questo specifico personaggio:

 $link = mysqli_connect($strMSQLdomein, $strMSQLUserName, $strMSQLPass, $strMSQLDBName); $strSQLSource = "SELECT * FROM Nevo_Nutrient_Gehaltes WHERE Productcode > 0 ORDER BY Productcode ASC"; $resultSource = mysqli_query($link, $strSQLSource); if($resultSource){ while($rowSource = mysqli_fetch_assoc($resultSource)){ $lngCurProductcode = (int)$rowSource['Productcode']; $strCurProduct_omschrijving = $rowSource['Product_omschrijving']; $strCurProduct_omschrijving =utf8_encode($strCurProduct_omschrijving); $strCurProduct_omschrijving =json_encode($strCurProduct_omschrijving); $strCurProduct_omschrijving = str_replace('\u00ad','',$strCurProduct_omschrijving); $strCurProduct_omschrijving =json_decode($strCurProduct_omschrijving); $strCurProduct_omschrijving =utf8_decode($strCurProduct_omschrijving); $sql = "UPDATE Nevo_Nutrient_Gehaltes SET Product_omschrijving = '$strCurProduct_omschrijving' WHERE Productcode = $lngCurProductcode"; $result = mysqli_query($link, $sql); } } mysqli_close($link); 

Questo funziona per questo carattere specifico, ma non è l'ideale.

Si tratta di una tabella molto grande con molti dati, potrebbero esserci altri caratteri nascosti. Come faccio a sbarazzarmene?

Inoltre, voglio impedire che ciò accada in futuro. Grazie alla mia ricerca ho scoperto che questo è un problema di codifica. I dati per questa tabella vengono inseriti tramite un module online (CMS) e probabilmente i caratteri nascosti vengono incollati in qualche modo. Forse copiando il text da altri siti Web o da un documento Word.

La tabella nel database mysql ha una codifica utf8_general_ci. La pagina html ha un'impostazione di carattere: charset = iso-8859-1. So che è meglio usare UTF-8 qui, ma quando lo faccio tutti i caratteri speciali (come 'ë') vengono visualizzati come quei piccoli diamanti con un punto interrogativo. Ho esaminato questo molte volte prima, ma non ho trovato un modo perfetto per affrontare questo particolare problema. So che posso usare il codice html per caratteri speciali, ma questo non è sempre pratico o addirittura ansible in un CMS.

Inoltre, ho un sacco di siti Web e non voglio wherer passare attraverso tutti i testi sostituendo caratteri speciali con codice html. Qualsiasi suggerimento è benvenuto: o).

Quindi la mia ultima domanda è: come prevenire quei caratteri nascosti che si insinuano nei dati, tenendo conto delle cose sopra menzionate?