Come può la mancanza del supporto Unicode in PHP influenzare una web app PHP?
Come può la mancanza del supporto Unicode in PHP influenzare una web app PHP?
Qualsiasi sito Web che pretende di essere multilingue o di gestire documenti o contenuti non rappresentabili in Latin-1 è probabile che sia problematico se non si dispone del supporto Unicode.
http://amazon.jp
sarà brindata senza Unicode. Un altro caso d'uso problematico è quando il contenuto può contenere simboli matematici e di altro tipo.
Tuttavia, il tuo esempio di Facebook suggerisce che in effetti puoi "fare" Unicode in PHP. In alternativa, http://facebook.jp
non è implementato in PHP. Ad ogni modo, la home page dice:
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
e ha molti contenuti UTF-8.
OK, ecco cosa dice il documento PHP per "String":
"A string is series of characters, therefore, a character is the same as a byte. That is, there are exactly 256 different characters possible. This also implies that PHP has no native support of Unicode. See utf8_encode() and utf8_decode() for some basic Unicode functionality."
Quindi PHP ha supporto Unicode. È solo che "stringhe native" non sono basate su Unicode.
Quindi, ciò significa che se hai bisogno di gestire qualsiasi linguaggio (o gruppo di lingue) che non può essere codificato in un set di caratteri a 8 bit, il tuo codice PHP sarà più ingombrante in qualsiasi punto in cui sia necessario per elaborare il contenuto come caratteri (reali).
Ci sono (almeno) tre diversi approcci al testo nel mondo della programmazione moderna.
tratta il testo come una sequenza di byte. C'è una convenzione diffusa che i valori di byte 0-127 rappresentano ASCII ma quale valore di byte 128-255 significa dipende dal contesto. Possono essere caratteri in un set di caratteri legacy a singolo byte, unità di codice di un set di caratteri legacy multibyte o unità di codice di UTF-8.
tratta il testo come una sequenza di punti di codice unicode.
tratta il testo come una sequenza di unità di codice UTF-16.
In generale un linguaggio e / o le librerie, le API e i protocolli utilizzati con esso incoraggiano o addirittura impongono un determinato approccio.
php prende il primo approccio. Una stringa è solo una sequenza di byte, non esiste un tipo speciale per Unicode. Alcuni potrebbero definire questo come "non supportare l'unicode", ma considererei una mis-caratterizzazione.
Ciò che significa è che se stai usando php con utf-8 è tua responsabilità farlo correttamente. UTF-8 è una codifica abbastanza ben educata, quindi non devi preoccuparti tanto quanto hai fatto con alcune codifiche multibyte legacy, ma devi comunque fare attenzione ad alcune operazioni. Soprattutto il troncamento (non voglio tagliare nel mezzo di una sequenza multibyte) e il conteggio dei caratteri (è un conteggio delle unità di codice utf-8 accettabili per l'applicazione data o è necessario contare i punti di codice o anche qualcos'altro). Se non ti prendi la responsabilità di queste cose, è probabile che i tuoi utenti vedano dei problemi.
D'altra parte si abbina bene a come funzionano i protocolli Internet. Un sistema che funziona con stringhe come sequenze di byte può gestire i dati Internet senza codificare le conversioni. Un sistema che funzioni in successioni di punti di codice o unità di codice utf-16 deve solitamente eseguire conversioni di testo che vanno da / verso Internet.
In realtà php ha metodi per manipolare stringhe multi-byte - per favore vedi mbstring . C'è anche un'opzione di configurazione in php.ini per usare le sostituzioni mbstring per la maggior parte (tutte) delle funzioni di manipolazione delle stringhe - per i dettagli su questo vedi sovraccarico di mbstring .
Significa che devi prendere scorciatoie e fare brutti scherzi per ottenere l'unicode. E questi trucchi renderanno il codice più ingombrante e meno leggibile.