diverse codifiche php
gli sceneggiatori alle prime armi non si preoccupano di cose come la codifica. Pertanto, nei siti a volte è possibile trovare un pasticcio terribile, quando i dati del database si ottengono in una codifica, la pagina è formata in un'altra e al server viene assegnato il terzo. di conseguenza, se la pagina può essere decifrata, quindi almeno 2 volte. Quindi, perché si verifica un problema simile e come superarlo?
nel segmento russo il più delle volte puoi trovare la cosiddetta Windows-encoding. chiamalo in modo diverso: windows-1251, cp1251 o anche ansi. il prossimo è utf-8. Puoi anche trovare il nome unicode, ma questo non è del tutto corretto, dal momento che Unicode è il nome generale per l'intero gruppo (utf-8, utf-16, utf-32). e una rarità molto popolare è koi8-r o semplicemente koi-8 - la codifica Linux una volta popolare. Certo, è possibile incontrare qualcos'altro nel segmento russo, ma questo è piuttosto un "indulgenza" dell'autore.
La principale differenza tra utf-8 e altri (principalmente windows-1251 e koi8-r) è l'ultimo byte e il numero massimo di caratteri che possono essere rappresentati usando queste codifiche è limitato a 256. Va da sé che per un testo completo potrebbe non essere abbastanza e per html è stata trovata una soluzione - l'uso dei cosiddetti mnemonici. per esempio:
© - & copy;
oltre al fatto che ognuno di questi personaggi è descritto da un gruppo di caratteri, il codice diventa illeggibile e il lavoro con il testo diventa più complicato. questo è dove il multibyte utf-8 viene in soccorso. è molto comodo usare lettere di diversi alfabeti e simboli diversi in un unico testo.
Pertanto, il set di condizioni iniziali più comodo è il seguente: la codifica del database, degli script php e delle pagine html / script js dovrebbe essere la stessa. Certo, puoi usarne di diversi, ma in questo caso c'è il rischio di confondersi. non importa quale tabella codici è usata. se il sito è solo per un pubblico di lingua russa, Windows-1251 sarà abbastanza. altrimenti, utf-8 sarebbe la scelta logica. la prima opzione è più o meno chiara. la codifica multibyte richiede alcuni gesti.
Quando si lavora con utf-8, un notepad notepad standard non funzionerà ! Il fatto è che questo editor, quando salva un file in questa codifica, aggiunge una firma all'inizio - 3 caratteri, il cosiddetto bom (byte order mark), che può essere usato per determinare la codifica quando si apre un file. è meglio scegliere un altro editor: notepad2 o blocco note ++ . nelle impostazioni è necessario scegliere di salvare senza una firma.
Il prossimo passo importante è lavorare con il database. È altamente auspicabile che la codifica del campo base / tabella / testo corrisponda alla codifica dello script (potrebbe essere cp1251 o utf-8 o qualcos'altro). se i dati dal database sono ottenuti sotto forma di "zyuk", molto probabilmente la codifica della connessione è diversa dai dati memorizzati nel database. La seguente query aiuterà a superare la situazione (eseguire immediatamente dopo la connessione al database):
se il sito utilizza windows-1251, è necessario specificarlo - cp1251.
in generale, non c'è niente di difficile. solo, le funzioni PHP standard non sono progettate per funzionare con stringhe multibyte. ma ci sono librerie standard che aiuteranno a correggere la situazione: iconv e mbstring . per le espressioni regolari, c'è anche un interruttore necessario che viene attivato con il modificatore u .
Bene, i dati dal database si ottengono, gli script sono scritti secondo tutte le regole. Resta da inviare il titolo corretto e visualizzare il codice della pagina nel browser dell'utente. inviamo il titolo così:
intestazione ('Content-Type: text / html; charset = utf-8');
se si utilizza la codifica a byte singolo, il valore per il set di caratteri sarà diverso - windows-1251 . Dopo ciò, i problemi non dovrebbero rimanere.
Alcuni esempi più semplici di utilizzo di utf-8 in PHP:
esempio 1: iconv, numero di caratteri per riga
$ s = 'stringa'; # stringa in utf-8 $ cnt1 = strlen ($ s); # conterrà il valore $ 12 cnt2 = iconv_strlen ($ s, 'UTF-8'); # valore corretto, 6
esempio 2: mbstring, il numero di caratteri in una stringa
$ s = 'stringa'; # stringa in utf-8 $ cnt1 = strlen ($ s); # conterrà il valore $ 12 cnt2 = mb_strlen ($ s, 'UTF-8'); # valore corretto, 6
esempio 3: espressioni regolari, ricerca e sostituzione
$ s = 'String'; # line in utf-8 $ s = preg_replace ('/ p / i', 'd', $ s); # la sostituzione non avverrà $ s = preg_replace ('/ p / iu', 'd', $ s); # risultato parola dock
il modificatore i prescrive la ricerca senza distinzione tra maiuscole e minuscole e il modificatore u dice al motore di espressioni regolari di funzionare con le stringhe utf-8.
se qualcuno dice che php non può funzionare con utf-8, sarà sbagliato. Per diversi anni ho fatto tutti i miei progetti in questa codifica e non ci sono stati problemi. I motori di ricerca stessi hanno usato da tempo questa meravigliosa codifica.
autori
offline 11 ore
x64 (aka andi)
Commenti: 2846 Pubblicazioni: 395 Registrazione: 02-04-2009
Quindi, perché si verifica un problema simile e come superarlo?