2009-09-19 11 views

risposta

15

Per farla breve: non si conosce veramente la codifica (set di caratteri) utilizzato sulle variabili che vengono passate allo script PHP tramite GET o POST (specialmente GET è un problema qui). Per convenzione i formulari POST alla risorsa lato server specificati nell'attributo action utilizzando la codifica della pagina che può essere specificata tramite un tag http-equiv -meta-tag (charset -meta-tag in HTML5) o tramite un'intestazione HTTP. In alternativa alcuni browser rispettano anche l'attributo accept-charset nel modulo quando si sceglie la codifica corretta.

La codifica dei parametri GET e l'URL stesso dipendono dalle impunture del browser e possono quindi essere controllate dall'utente. Non dovresti fare affidamento su una codifica specifica.

In genere circumnavigate la maggior parte dei problemi relativi alla codifica utilizzando costantemente UTF-8 per qualsiasi cosa e specificando la codifica corretta nell'intestazione HTTP (Content-Type: text/html; charset=UTF-8) - questo produrrà la codifica corretta (UTF-8) in tutto le variabili che vengono passate nella stringa (non stiamo parlando di script rouge che deliberatamente provano a fare confusione con la codifica per consentire alcuni vettori di attacco nel tuo script). Inoltre non dovresti fare affidamento su caratteri non ascii nei tuoi parametri GET o nell'URL (questo è anche un motivo per cui i link SEO-friendly rimuovono quei caratteri o li sostituiscono).

Se si è accertato che UTF-8 è l'unico set di caratteri consentito, è possibile utilizzare mb_strlen($string, 'UTF-8') per verificare la lunghezza di una variabile, ad esempio.

EDIT: (aggiunto alcuni link)

Alcune cose per voi a leggere:

+0

La codifica dell'URL dipende anche dal documento di riferimento. Solo se l'URL viene inserito direttamente nella barra degli indirizzi, le impostazioni del browser sono fondamentali. – Gumbo

5

utilizzare mb_internal_encoding per sapere quale codifica è attualmente impostata. Se l'applicazione utilizza un registro di codifica diversa, è meglio utilizzare mb_strlen.

Acclamazioni

1

Di solito si hanno il controllo della codifica dei caratteri da quando si crea il $ _REQUEST dal codice HTML si invia al client.

es .: Viene generato da una pagina inviata da PHP.

Pertanto non è necessario rilevare la codifica.

L'utilizzo di mb_functions richiede l'attivazione dell'estensione multibyte, quindi se si sta distribuendo il codice, è necessario essere consapevoli che non tutti lo avranno.

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

O in HTML:

<meta charset="utf-8"> 

http://www.w3.org/International/O-charset

Edit: php6 ha il supporto UTF-8, non PHP5.

+0

“le funzioni di stringa sono UTF-8 compatibile” . significa che strlen in php5 restituirà la lunghezza corretta della stringa utf8? – lovespring

+0

"A partire da PHP5, le funzioni di stringa sono compatibili con UTF-8." Questo non è assolutamente corretto. Le funzioni di stringa interna di PHP operano tutte a livello di byte, il che significa che non possono gestire caratteri a più byte (valido per PHP <6). Tutte le funzioni interne in cui la lunghezza di un carattere (in byte) è importante per il suo funzionamento sono soggette a errori quando si lavora con quei set di caratteri. L'estensione multibyte citata (mb_ *) ha un'abilità di sovraccarico ma sconsiglio vivamente di usarla. –

+0

Ero lontano da lì, PHP5 non ha alcun supporto multibyte. – bucabay