2012-12-29 22 views
10

Ho alcuni testi in francese (contenenti caratteri accentati come "é"), memorizzati in una tabella MySQL la cui raccolta è utf8_unicode_ci (sia la tabella che le colonne), che voglio produrre su un Pagina HTML5.Caratteri accentati nella tabella mySQL

Il set di pagine HTML è UTF-8 (< meta charset = "utf-8" />) ei file PHP stessi sono codificati come "UTF-8 senza BOM" (utilizzo Notepad ++ su Windows). Io uso PHP5 per richiedere il database e generare l'HTML.

Tuttavia, nella pagina di output, i caratteri speciali (come "é") appaiono confusi e vengono sostituiti da " ".

Durante la navigazione nel database (tramite phpMyAdmin), gli stessi caratteri accentati vengono visualizzati correttamente.

Cosa mi manca qui?

(Nota: la modifica della codifica della pagina (tramite il menu "sviluppatore web" di Firefox) a ISO-8859-1 risolve il problema ... tranne per i caratteri speciali che appaiono direttamente nei file PHP, che ora sono danneggiati. Comunque, preferisco capire perché non funziona come UTF-8 di modificare la codifica senza capire perché funzioni. ^^;)

+0

Si potrebbe provare anche a inviare un'intestazione per esso da php. –

risposta

29

ho sperimentato lo stesso problema prima, e quello che ho fatto sono i seguenti

1) Utilizzare Notepad ++ (può quasi adattare in qualsiasi codifica) o eclissi ed essere sicuri per salvare o aprire in UTF-8 senza BOM.

2) impostare la codifica nell'intestazione PHP, utilizzando header('Content-type: text/html; charset=UTF-8');

3) rimuovere eventuali spazi aggiuntivi sul l'inizio e la fine dei miei file PHP.

4) impostare tutte le mie codifiche di tabella e colonne su utf8mb4_general_ci o utf8mb4_unicode_ci tramite PhpMyAdmin o qualsiasi client mySQL che possiedi. Un confronto tra i due codifiche sono disponibili here

5) insieme mysql collegamento charset UTF-8 (io uso DOP per la mia connessione al database)

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8" 
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET utf8" 

o semplicemente eseguire le query SQL prima di andare a prendere i dati

6) utilizzare un meta tag <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

7) utilizzare un determinato codice della lingua per il francese <meta http-equiv="Content-language" content="fr" />

8) modificare l'elemento html lang alla lingua desiderata

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr"> 

e sarà l'aggiornamento di questo più perché ho davvero avuto un momento difficile risolvere questo problema prima, perché avevo a che fare con i caratteri giapponesi nei miei progetti passati

9) Alcuni tipi di carattere non sono disponibili nel PC client, è necessario utilizzare Google fonts per includere sul vostro CSS

10) non terminare il file sorgente PHP con ?>

NOTA:

ma se tutto quello che ho detto sopra non funziona, provare a regolare la codifica a seconda del set di caratteri che si vuole veramente da visualizzare, per me ho impostato tutto per SHIFT-JIS per visualizzare tutto il mio personaggi giapponesi e funziona davvero bene. Ma usando UFT-8 deve essere la priorità

+6

+1 per 'SET NAMES', un errore comune –

+1

Sì,' SET NAMES' è probabilmente il suo problema. – tftd

+4

In effetti "SET NAMES" mancava e aggiungerlo era sufficiente per correggere il mio problema. Dato che non uso PDO, ho dovuto usare la seguente sintassi: 'mysql_query ('SET NAMES utf8');'. Grazie mille per la tua risposta dettagliata! – s427

2

Se il tuo php.inidefault_charset non è impostato su UTF-8, è necessario usare un Content-type per definire i tuoi dati. Applicare la seguente intestazione nella parte superiore del file (s):

header("Content-type: text/html; charset=utf-8"); 

Se avete ancora problemi con la codifica, la causa può essere uno dei seguenti:

  • un problema del server charset di database (controllare la codifica del server)
  • un problema client di database charset (controllare la codifica della connessione)
  • un problema tabella di database charset (controllare la codifica della tabella)
  • un DEFA php problema codifica ult (check default_encoding parametro parameters.ini)
  • un multibyte mal configurato (vedi mb_string parametri parameters.ini)
  • un problema <form> charset (verificare che sia inviato come utf-8)
  • un <html> problema di charset (in cui non è impostata alcuna enctype nel file html)
  • a Content-encoding: problema (dove la codifica errata viene inviata da Apache).
+0

Grazie per la risposta. Problema risolto aggiungendo il comando 'SET NAMES' dopo la connessione al database. – s427

14

questo funziona per me

  1. Fai il database utf8_general_ci
  2. Salvare i file in N ++ come UTF-8 without BOM
  3. Mettere $mysqli->query('SET NAMES utf8'); dopo la connessione al database nel file PHP
  4. Put < meta charset="utf-8" /> nel codice HTML

Funziona perfettamente.

+0

Grazie per la risposta. Era un problema di 'SET NAME' mancante. – s427

+0

Salva senza BOM al sublime ha funzionato !!!!!!!!! –

+0

Grazie amico !, più sintetizzato della prima risposta. :) –

1
  1. Tipo qualcosa pieni segni francesi nel vostro (PHP) file
  2. Salva il file come UTF-8
  3. linea Incolla sotto nella vostra intestazione sito

    header('Content-Type: text/html; charset=utf-8');

Pagina (file) deve avere un bell'aspetto.

Se va bene andare here per comportamento mysql dopo (SET_NAMES).

+0

Grazie per la risposta. Problema risolto. Mi mancava davvero "SET NAME". – s427

2

SET NAMES ha funzionato per me.

Il mio problema era in una delle mie pagine di modifica, il campo con i caratteri stranieri non veniva visualizzato, sulle pagine Web di produzione non c'erano problemi.

1

So che hai già una risposta. È fantastico. Ma stranamente nessuna di queste risposte ha risolto il mio problema. Mi piacerebbe condividere la mia risposta a beneficio degli altri che potrebbero incontrare gli stessi problemi.

Ho anche avuto gli stessi problemi dell'OP, per quanto riguarda gli accenti francesi in un'applicazione multilingue.

Ma ho riscontrato questo problema per la prima volta quando ho dovuto passare (dati accentati in francese) come segmenti nelle chiamate AJAX.

Sì, è necessario che il database sia impostato per funzionare con UTF8. Ma il fatto che le chiamate AJAX avessero stringhe di query (nel mio caso segmenti, dato che sto usando CodeIgniter), ho dovuto semplicemente codificare il testo francese.

Per eseguire questa operazione sul lato client, utilizzare la funzione encodeURI() di Javascript con i dati.

E per invertire in PHP, è sufficiente utilizzare urldecode($MyStr) in cui i dati sono stati ricevuti come parametri.

Spero che questo aiuti.

Problemi correlati