2013-06-20 21 views
7

Ho la seguente riga di indirizzo: Praha 5, Staré Mesto,PHP Utf8 decodifica Problema

ho bisogno di usare la funzione utf8_decode() su questa stringa prima che io possa scrivere in un file PDF (usando dompdf lib).

Tuttavia, la funzione di decodifica di php utf8 per la riga di indirizzo sopra riportata non è corretta (o piuttosto incompleta).

Il seguente codice:

<?php echo utf8_decode('Praha 5, Staré Město,'); ?> 

Produce questo:?

Praha 5, Staré M STO,

Qualsiasi idea del perché Ø non è sempre decodificato?

+0

utf8_decode converte semplicemente una stringa codificata in UTF-8, la stringa è utf8_encoded? –

risposta

14

utf8_decodeconverte la stringa da una codifica UTF-8 a ISO-8859-1, a.k.a. "Latin-1".
La codifica Latin-1 non può rappresentare la lettera "ì". È così semplice.
"Decodifica" è un termine improprio totale, equivale a iconv('UTF-8', 'ISO-8859-1', $string).

Vedere What Every Programmer Absolutely, Positively Needs To Know About Encodings And Character Sets To Work With Text.

+0

Grazie la migliore risposta (2015) +1 – delive

+1

@deceze 'utf8_decode converte la stringa da una codifica UTF-8 a ISO-8859-1' Questo mi ha salvato probabilmente un paio d'ore!sarei felice di comprarti un drink se fossi nel nostro ufficio :) – whizzkid

+0

@whizzkid Hit me up la prossima volta che sei in Germania ...; o) – deceze

0

non è necessario che (@Rajeev: questa stringa viene rilevato automaticamente come codifica UTF-8:

echo mb_detect_encoding('Praha 5, Staré Město,'); 

sarà sempre tornare UTF-8.).

Preferisci vedere: https://code.google.com/p/dompdf/wiki/CPDFUnicode

+0

Ho rimosso utf8_decode e impostato e anche DOMPDF_UNICODE_ENABLED è impostato su true in config. Tuttavia, non funziona, appare come? – Latheesan

+0

Sto usando il font 'Helvetica', potrebbe essere perché? – Latheesan

+0

potresti dover installare un altro font. Controlla le risposte qui: http://stackoverflow.com/questions/990181/dompdf-problem-with-cirillic-characters – scraaappy

0

Finii con un UTF-8/UTF-16 funzione di home-grown decodifica (convertire in & #number; rappresentazioni), non ho trovato alcun modello al motivo per cui non viene rilevato UTF-8, ho il sospetto che sia perché la sequenza "codificato-come" non è sempre esattamente nella stessa posizione nella stringa restituita. Potresti fare qualche controllo aggiuntivo su questo.

Indicatore UTF-8 a tre caratteri: $ startutf8 = chr (0xEF) .chr (187) .chr (191); (se vedi QUI OVUNQUE, non solo i primi tre caratteri, la stringa è codificata in UTF-8)

Decodifica in base alle regole UTF-8; questo ha sostituito una versione precedente che entrava sferragliando a byte per byte: utilizzando

function charset_decode_utf_8 ($string) { 
/* Only do the slow convert if there are 8-bit characters */ 
/* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */ 
if (! ereg("[\200-\237]", $string) and ! ereg("[\241-\377]", $string)) 
    return $string; 

// decode three byte unicode characters 
$string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/e",  
"'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'", 
$string); 

// decode two byte unicode characters 
$string = preg_replace("/([\300-\337])([\200-\277])/e", 
"'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'", 
$string); 

return $string; 
} 
0

problema è nella tua codifica del file PHP, salvare il file in UTF-8 codifica, allora anche senza bisogno di usare utf8_decode, se si ottiene questi dati 'Praha 5, Staré Město,' da database, meglio cambiarlo charset in UTF-8