PHP: codifica corrente utilizzata per inviare dati al browser
-
02-07-2019 - |
Domanda
Come posso sapere quale codifica verrà utilizzata da PHP durante l'invio di dati al browser? Cioè con l'intestazione Cotent-Type, ad esempio: iso-8859-1.
Soluzione
Di solito i server Apache + PHP dei webhoster sono configurati per inviare NO charset
intestazione .
I modi più brevi per testare come è configurato il tuo server sono questi:
- Utilizza questo strumento per visualizzare l'intestazione del server inserendo una delle tue pagine nel tuo webiste .
Se nelle intestazioni del server viene visualizzato un
<?php echo ini_get('default_charset'); ?>
significa che il server lo sta utilizzando, di solito non conterrà unAddDefaultCharset some_charset
. - Un altro modo è quello di eseguire questo semplice script sul tuo server: <=> Come detto sopra questo di solito stampa una stringa vuota, se diversa ti mostrerà il <=> del PHP.
La seconda soluzione suppone che Apache non sia configurato con <=> che di solito non è il caso, ma in tal caso temo che l'impostazione di Apache potrebbe sovrascrivere la direttiva ini PHP deafult_charset.
Altri suggerimenti
Puoi usare la soluzione header () che William ha suggerito, tuttavia se stai eseguendo Apache e la configurazione di Apache sta usando un set di caratteri predefinito, che vincerà ogni volta (Internet Explorer diventerà pazzo) Vedi: AddDefaultCharset
Tieni presente che i tipi di contenuto e le codifiche sono due cose diverse. text / html è un tipo di contenuto; ISO-8859-1 e UTF-8 sono codifiche.
L'intestazione della risposta HTTP che il server invia in genere è simile al seguente:
Content-Type: text/html; charset=utf-8
& quot; & Charset quot; è in realtà la codifica dei caratteri. Non è in un'intestazione separata; tuttavia esiste un'intestazione chiamata " Content-Encoding " che specifica il tipo di compressione utilizzato dalla risposta (ad esempio gzip).
Se si desidera modificare la codifica dei caratteri in UTF-8, in un file che contiene HTML:
<?
header("Content-Type: text/html; charset=utf-8");
Puoi impostare il tuo con header('Content-type: xxx/yyy');
, ma credo che text / html sia inviato di default.
AFAIK, PHP invia le stringhe per byte. cioè, se le tue variabili contengono UTF-8, invierà UTF-8. se hai iso-8859-1, lo invierà anche quello. se li mescoli, non sarà carino.
Se il tuo server non è configurato per avere un contenuto o un set di caratteri predefiniti, e nemmeno PHP, PHP invierà solo Content-Type: text/html
- non specificherà affatto un set di caratteri e invierà i byte come li vede in la sceneggiatura.
Se un browser riceve una pagina senza set di caratteri specificato, possono accadere varie cose:
- la maggior parte dei browser ha un " Encoding / Charset " menu; se l'utente ne seleziona esplicitamente uno, il browser proverà ad applicarlo. Non succede troppo spesso, quindi:
- alcuni browser tentano di renderizzarlo con un set di caratteri predefinito (che dipende dalle impostazioni locali, ad esempio per FF e cs_CZ era
iso-8859-2
; YMMV) - IE proverà a determinare euristicamente il set di caratteri (ci vorrà un'ipotesi, basata sulla distribuzione dei caratteri - e molte volte lo fa bene; a volte lo sbaglia e si ottiene una pagina in rumeno interpretata come testo cinese, che di solito significa " illeggibile ")
- alcuni vecchi browser torneranno su
us-ascii
Se con questa procedura, il set di caratteri dello script PHP e il set di caratteri del browser corrispondono, il testo sarà - accidentalmente - leggibile. Altrimenti, ci saranno strani segni e fenomeni simili.