Domanda

Accade spesso che caratteri come & # 233; vengano trasformati in & # 195; & # 169; , anche se le regole di confronto per il database MySQL, tabella e il campo è impostato su utf8_general_ci. La codifica nel Content-Type per la pagina è anche impostata su UTF8.

So di utf8_encode / decode, ma non sono abbastanza sicuro su dove e come usarlo.

Ho letto " Il minimo assoluto che ogni sviluppatore di software deve assolutamente conoscere positivamente, Unicode e Set di caratteri (senza scuse!) " articolo, ma ho bisogno di alcuni puntatori specifici di MySQL / PHP.

Domanda: come posso assicurarmi che i dati inseriti dall'utente contenenti caratteri internazionali non vengano danneggiati?

È stato utile?

Soluzione

Al primo sguardo a http://www.nicknettleton.com / zine / php / php-utf-8-cheatsheet Penso che manchi una cosa importante (forse l'ho trascurata). A seconda dell'installazione e / o della configurazione di MySQL, devi impostare la codifica della connessione in modo che MySQL sappia quale codifica ti aspetti sul lato client (ovvero il lato client della connessione MySQL, che dovrebbe essere lo script PHP). Puoi farlo emettendo manualmente un

SET NAMES utf8

interroga prima di qualsiasi altra interrogazione che invii al server MySQL.

Se stai usando PDO sul lato PHP puoi impostare la connessione per emettere automaticamente questa query su ogni (ri) connessione usando

$db=new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8");

durante l'inizializzazione della connessione db.

Altri suggerimenti

Fascicolazione e set di caratteri non sono la stessa cosa. Il tuo confronto deve corrispondere al set di caratteri, quindi se il tuo set di caratteri è utf-8, lo stesso dovrebbe fare il confronto. Scegliere le regole di confronto errate non altera i tuoi dati: fai semplicemente in modo che il confronto delle stringhe / l'ordinamento non funzionino correttamente

Detto questo, ci sono diversi posti in cui puoi impostare le impostazioni dei set di caratteri in PHP. Consiglierei di usare utf-8 dappertutto, se possibile. I luoghi che richiedono il set di caratteri specificato sono:

  • Il database. Questo può essere impostato a livello di database, tabella e campo e persino a livello di query.
  • Connessione tra PHP e database.
  • output HTTP; Assicurati che l'header HTTP Content-Type specifichi utf-8. Puoi impostare i valori predefiniti in PHP e in Apache oppure puoi utilizzare il codice intestazione .
  • input HTTP. Generalmente i moduli verranno inviati nello stesso set di caratteri in cui è stata pubblicata la pagina, ma per essere sicuri, è necessario specificare il proprietà accept-charset . Assicurati inoltre che gli URL siano codificati in utf-8 o evita di utilizzare caratteri non ASCII nei parametri url (e GET).

utf8_encode / le funzioni di decodifica hanno un nome un po 'strano. Si convertono specificamente tra latin1 (ISO-8859-1) e utf-8. Se tutto nella tua applicazione è utf-8, non dovrai usarli molto.

Ci sono almeno due gotcha per quanto riguarda utf-8 e PHP. Il primo è che le funzioni di stringa incorporate di PHP prevedono che le stringhe siano a byte singolo. Per molte operazioni, questo non ha importanza, ma significa che non puoi fare affidamento su strlen e altre funzioni. C'è un buon riassunto delle limitazioni in questa pagina . Di solito, non è un grosso problema, ma soprattutto quando si usano librerie di terze parti, è necessario essere consapevoli del fatto che le cose potrebbero esplodere su questo. Un'opzione è anche usare l'estensione mb_string, che ha l'opzione di sostituire tutte le funzioni problematiche con alternative consapevoli di utf-8. Non è ancora una soluzione antiproiettile al 100%, ma funzionerà nella maggior parte dei casi.

Un altro problema è che alcune installazioni di PHP hanno ancora magic_quotes attivata. Questo problema è ortogonale a utf-8, ma può portare ad alcuni graffi alla testa. Disattivalo, per la tua sanità mentale.

Non c'è molto da dire che non è trattato in questo articolo

http://developer.loftdigital.com/blog/php-utf -8-bigino

Cose da fare:

  • Assicurati che Apache distribuisca il contenuto UTF-8. Fallo nel tuo httpd.conf, oppure usa la funzione header () di PHP per farlo manualmente.
  • Assicurarsi che la connessione al database sia UTF8. SET NAMES utf8 fa il trucco.
  • Assicurati che tutte le tue tabelle siano impostate su UTF8.
  • Assicurati che tutti i tuoi file PHP e template siano codificati come UTF8 se li memorizzi in caratteri internazionali.

Di solito non devi fare molto usando le funzioni mb_string o utf8_encode / decode quando lo fai.

Per una migliore correttezza dell'unicode, dovresti usare utf8_unicode_ci (sebbene la documentazione sia un po 'vaga sulle differenze). Dovresti anche assicurarti che i seguenti flag Mysql siano impostati correttamente -

  • default-character-set = utf8
  • skip-character-set-client-handshake // Importante in modo che il client non imponga un'altra codifica

Questi possono essere impostati nel file di configurazione mysql (nella scheda [mysqld]) o in fase di esecuzione inviando le query appropriate.

Indipendentemente dalla lingua in cui è scritto, se dovessi creare un'app che consente una vasta gamma di codifiche, gestiscila a pezzi:

  • Identifica la codifica
    • in qualche modo vuoi scoprire con che tipo di codifica hai a che fare, altrimenti è abbastanza inutile considerarlo ulteriormente. Finirai con caratteri spazzatura.
  • Gestisci i tuoi byte
    • pensa a queste stringhe meno come "stringhe" di caratteri e più come elenchi di byte
    • PHP è particolarmente subdolo. Non lasciare che i tuoi dati vengano troncati al volo. Se stai regexando una stringa UTF-8, assicurati di identificarla come tale
  • Conservare per il display LCD
    • Ancora una volta, non si desidera troncare i dati. Se stai memorizzando una frase in inglese, puoi anche memorizzare una serie di glifi mandarino? Che ne dici di arabo? Quale di questi richiederà più spazio? Conto per questo.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top