GNU/Linux >> Linux Esercitazione >  >> Linux

UTF-8 fino in fondo

Archiviazione dati :

  • Specifica il utf8mb4 set di caratteri su tutte le tabelle e le colonne di testo nel database. Ciò consente a MySQL di archiviare e recuperare fisicamente i valori codificati in modo nativo in UTF-8. Si noti che MySQL utilizzerà implicitamente utf8mb4 encoding se un utf8mb4_* è specificata la collation (senza alcun set di caratteri esplicito).

  • Nelle versioni precedenti di MySQL (<5.5.3), sfortunatamente sarai costretto a usare semplicemente utf8 , che supporta solo un sottoinsieme di caratteri Unicode. Vorrei scherzare.

Accesso ai dati :

  • Nel codice della tua applicazione (ad es. PHP), in qualunque metodo di accesso al DB utilizzi, dovrai impostare il set di caratteri della connessione su utf8mb4 . In questo modo, MySQL non esegue alcuna conversione dal suo UTF-8 nativo quando passa i dati alla tua applicazione e viceversa.

  • Alcuni driver forniscono il proprio meccanismo per configurare il set di caratteri della connessione, che aggiorna il proprio stato interno e informa MySQL della codifica da utilizzare sulla connessione:questo è di solito l'approccio preferito. In PHP:

    • Se stai utilizzando il livello di astrazione PDO con PHP ⥠5.3.6, puoi specificare charset nel DSN:

       $dbh = new PDO('mysql:charset=utf8mb4');
      
    • Se stai usando mysqli, puoi chiamare set_charset() :

        $mysqli->set_charset('utf8mb4');       // object oriented style
        mysqli_set_charset($link, 'utf8mb4');  // procedural style
      
    • Se sei bloccato con il semplice mysql ma ti capita di eseguire PHP ⥠5.2.3, puoi chiamare mysql_set_charset .

  • Se il driver non fornisce il proprio meccanismo per impostare il set di caratteri di connessione, potrebbe essere necessario eseguire una query per dire a MySQL come la tua applicazione si aspetta che i dati sulla connessione siano codificati:SET NAMES 'utf8mb4' .

  • Stessa considerazione per utf8mb4 /utf8 si applica come sopra.

Uscita :

  • UTF-8 dovrebbe essere impostato nell'intestazione HTTP, ad esempio Content-Type: text/html; charset=utf-8 . Puoi ottenerlo impostando default_charset in php.ini (preferito) o manualmente utilizzando header() funzione.
  • Se la tua applicazione trasmette testo ad altri sistemi, anche questi dovranno essere informati della codifica dei caratteri. Con le applicazioni web, il browser deve essere informato della codifica in cui vengono inviati i dati (tramite intestazioni di risposta HTTP o metadati HTML).
  • Quando si codifica l'output utilizzando json_encode() , aggiungi JSON_UNESCAPED_UNICODE come secondo parametro.

Input :

  • I browser invieranno i dati nel set di caratteri specificato per il documento, quindi non è necessario fare nulla di particolare sull'input.
  • In caso di dubbi sulla codifica della richiesta (nel caso in cui possa essere manomessa), è possibile verificare che ogni stringa ricevuta sia UTF-8 valida prima di provare a memorizzarla o utilizzarla ovunque. mb_check_encoding() di PHP fa il trucco, ma devi usarlo religiosamente. Non c'è davvero modo di aggirare questo problema, poiché i client malintenzionati possono inviare dati in qualsiasi codifica desiderino e non ho trovato un trucco per convincere PHP a farlo per te in modo affidabile.

Altre considerazioni sul codice :

  • Abbastanza ovviamente, tutti i file che servirai (PHP, HTML, JavaScript, ecc.) dovrebbero essere codificati in UTF-8 valido.

  • Devi assicurarti che ogni volta che elabori una stringa UTF-8, lo fai in modo sicuro. Questa è, purtroppo, la parte difficile. Probabilmente vorrai fare ampio uso del mbstring di PHP estensione.

  • Le operazioni di stringa integrate di PHP non lo sono per impostazione predefinita UTF-8 sicuro. Ci sono alcune cose che puoi tranquillamente fare con le normali operazioni di stringhe PHP (come la concatenazione), ma per la maggior parte delle cose dovresti usare l'equivalente mbstring funzione.

  • Per sapere cosa stai facendo (leggi:non rovinare tutto), devi davvero conoscere UTF-8 e come funziona al livello più basso possibile. Dai un'occhiata a uno qualsiasi dei link da utf8.com per alcune buone risorse per imparare tutto ciò che devi sapere.


Oltre a impostare default_charset in php.ini, puoi inviare il set di caratteri corretto usando header() dall'interno del codice, prima di qualsiasi output:

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

Lavorare con Unicode in PHP è facile fintanto che ti rendi conto che la maggior parte delle funzioni di stringa non funzionano con Unicode e alcune potrebbero alterare completamente le stringhe . PHP considera i "caratteri" lunghi 1 byte. A volte va bene (ad esempio, burst() cerca solo una sequenza di byte e la usa come separatore, quindi non importa quali caratteri effettivi cerchi). Ma altre volte, quando la funzione è effettivamente progettata per funzionare su caratteri , PHP non ha idea che il tuo testo contenga caratteri multibyte che si trovano con Unicode.

Una buona libreria da controllare è phputf8. Questo riscrive tutte le funzioni "cattive" in modo da poter lavorare in sicurezza sulle stringhe UTF8. Ci sono estensioni come l'estensione mb_string che provano a farlo anche per te, ma preferisco usare la libreria perché è più portabile (ma scrivo prodotti per il mercato di massa, quindi è importante per me). Ma phputf8 può usare mb_string dietro le quinte, comunque, per aumentare le prestazioni.


Vorrei aggiungere una cosa all'eccellente risposta di chazomaticus:

Non dimenticare nemmeno il tag META (come questo, o la sua versione HTML4 o XHTML):

<meta charset="utf-8">

Sembra banale, ma IE7 mi ha dato problemi in passato.

Stavo facendo tutto bene; il database, la connessione al database e l'intestazione HTTP Content-Type erano tutti impostati su UTF-8 e funzionava bene in tutti gli altri browser, ma Internet Explorer insisteva ancora nell'usare la codifica "Europa occidentale".

Si è scoperto che nella pagina mancava il tag META. L'aggiunta ha risolto il problema.

Modifica:

Il W3C ha in realtà una sezione piuttosto ampia dedicata a I18N. Hanno una serie di articoli relativi a questo problema, che descrivono il lato HTTP, (X)HTML e CSS delle cose:

  • Domande frequenti:modifica della codifica della pagina (X)HTML in UTF-8
  • Dichiarazione delle codifiche dei caratteri in HTML
  • Tutorial:set di caratteri e codifiche in XHTML, HTML e CSS
  • Impostazione del parametro del set di caratteri HTTP

Raccomandano di utilizzare sia l'intestazione HTTP che il meta tag HTML (o la dichiarazione XML in caso di XHTML servito come XML).


Linux
  1. Qual è il miglior modo indipendente dalla distribuzione/shell per impostare le variabili d'ambiente?

  2. Il modo più veloce per estrarre un ISO?

  3. Il modo migliore per annullare tutti i lavori Slurm dall'output del comando Shell?

  4. Come impostare la versione PHP per dominio, utilizzando cPanel?

  5. Come impostare la versione PHP per cartella?

Come configurare WordPress su un Raspberry Pi

Come impostare il nome host Pretty

Come impostare il lavoro cron per eseguire uno script PHP in cPanel?

Come impostare una versione php tramite .htaccess in cPanel?

Come configurare il firewall UFW su Linux

Installa Postman Ubuntu 18.04:il modo più semplice!