Personaggi speciali in PHP / MySQL
-
10-07-2019 - |
Domanda
Nel database sono presenti parole che includono caratteri speciali (principalmente in spagnolo, come le tilde). Nel database tutto viene salvato e mostrato correttamente con PHPmyAdmin, ma quando ottengo i dati (usando PHP) e li visualizzo in un browser, ottengo un carattere strano, come un "? & Quot; con un quadrato ... Ho bisogno di una correzione generale, quindi non ho bisogno di scappare ogni personaggio ogni volta, e inoltre sarei in grado di inserire caratteri speciali spagnoli da un modulo PHP nel database ...
L'HTML è corretto:
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
Tutte le tabelle e le banche dati sono impostate su utf8_spanish
Il personaggio che ottengo: & # 65533;
Qualche suggerimento ???
Grazie !!!
Soluzione 4
Modificato il set di caratteri HTML in ISO-8859-1 risolto il problema! Sciocco
Altri suggerimenti
Vorrei solo fornire ulteriori dettagli sulla soluzione proposta da vartec che è (a seconda dell'installazione di MySQL) la soluzione più corretta al tuo problema. Prima di tutto il problema relativo al set di caratteri / alla codifica in MySQL è un argomento piuttosto complesso che è ampiamente trattato nel manuale di MySQL Capitolo 9.1 " Supporto set di caratteri " . Nel tuo caso soprattutto 9.1.4. " Set di caratteri di connessione e regole di confronto " saranno i più pertinenti.
Per farla breve: MySQL deve sapere quale set di caratteri / codificare l'applicazione client (parlando dal database personale che è il tuo script PHP) si aspetta in quanto transcodificherà tutti i dati di stringa dal set di caratteri interno / codifica definito in a livello di server, database, tabella o colonna nel set di caratteri di connessione / codifica. Stai usando UTF-8 sul lato client, quindi devi dire a MySQL che usi UTF-8. Questo viene fatto dal comando MySQL SET NAMES 'utf8'
che deve essere inviato come prima query all'apertura di una connessione. A seconda dell'installazione e della libreria client MySQL che usi nello script PHP, questo può essere fatto automaticamente su ogni connessione.
Se usi PDO è solo questione di impostare un parametro di configurazione
$db = new PDO($dsn, $user, $password);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
L'uso di mysqli per modificare il set di caratteri / la codifica del client è ancora più semplice:
$mysqli = new mysqli("localhost", "user", "password", "db");
$mysqli->set_charset("utf8");
Spero che ciò contribuirà a rendere il tutto più comprensibile.
Emetti SET NAMES 'utf8'
subito dopo la connessione:
$mysqli = new mysqli("localhost", "user", "password", "database");
$mysqli->query("SET NAMES 'utf8'");
Chiedi a MySQL di tradurlo automaticamente
$conn = mysql_connect('host', 'user', 'password');
mysql_set_charset('utf8',$conn);
http://es.php.net/manual/ it / function.mysql-set-charset.php
MODIFICA: dal tuo commento ho raccolto, che questo è effettivamente codificato in latino1 quindi
mysql_set_charset('latin1_spanish_ci',$conn);
L'ho trovato da qualche parte e da allora lo uso nel suo complesso senza pensarci troppo.
mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'");
santa merda .. questo mi stava facendo impazzire. stavo cercando di fare la stessa cosa. ho aggiunto un'intestazione HTML di codifica utf-8 .. mysqli_set_charset () mi ha salvato, ore dopo, ma sono contento di averlo funzionante ora
un'altra funzione da provare per codificare caratteri e accenti speciali è htmlentities ()
Puoi semplicemente fare:
$link = mysql_connect("host", "user", "password");
mysql_select_db("database", $link); mysql_query("SET NAMES 'utf8';", $link);
Attiva la codifica Unicode nel tuo HTML.
Quando ho a che fare con personaggi speciali mi prendo sempre cura di quanto segue:
- I set di caratteri di database, tabella e campo sono tutti impostati su utf8_general_ * o utf8_unicode_ *
- Mi assicuro che il mio editor salvi i file PHP con il giusto set di caratteri
- Ho impostato default_charset in php.ini su UTF-8 o
- Invio un Content-Type: text / html; charset = intestazione UTF-8
- Il set di caratteri nel tag META è UTF-8 (questo viene sostituito dall'intestazione HTTP Content-Type)
- Durante la connessione a MySQL, eseguo le seguenti query:
- SET NAMES utf8
- SET PERSONAGGIO SET utf8
- SET COLLATION_CONNECTION = " utf8_general_ci " / " utf8_general_ci "
Sei sicuro di avere i dati UTF8 nel tuo database per cominciare?
La risposta che ha funzionato per me è quella che Stefan Gehrig ha pubblicato:
$ mysqli- > set_charset (" utf8 ");
Ho solo bisogno di aggiungere quella linea dopo aver definito la connessione e i miei problemi sono stati risolti! :)
(Sto pubblicando una risposta poiché non posso commentare ...).
la mia soluzione è: fare tutto quanto sopra offerto ma sto anche lavorando con notepad ++ e il file deve essere salvato in questo modo: vai alla codifica nella scheda del menu e salva il file - > encode in utf8
È interessante notare che questo codice non ha funzionato per me:
$link = mysqli_connect('localhost', 'my_user', 'my_password', 'test');
mysqli_set_charset($link, "utf8");
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows latin1
Tuttavia, l'impostazione del set di caratteri all'interno di una condizione funziona:
if (!mysqli_set_charset($link, "utf8")) {
printf("Error loading character set utf8: %s\n", mysqli_error($link));
exit();
} else {
printf("Current character set: %s\n", mysqli_character_set_name($link));
//shows utf8
}
La mia configurazione:
$ rpm -qa|grep -E "php|maria"
mariadb-5.5.56-2.el7.x86_64
mariadb-server-5.5.56-2.el7.x86_64
mariadb-libs-5.5.56-2.el7.x86_64
php-pdo-5.4.16-45.el7.x86_64
php-cli-5.4.16-45.el7.x86_64
php-5.4.16-45.el7.x86_64
php-common-5.4.16-45.el7.x86_64
php-mysql-5.4.16-45.el7.x86_64