diverse codifiche php

  1. autori
  2. x64 (aka andi)

gli sceneggiatori alle prime armi non si preoccupano di cose come la codifica

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?