2010-09-15 6 views
5

Sto riscontrando alcuni problemi con l'utilizzo di PHP per convertire il contenuto del database ISO-8859-1 in UTF-8. Sto facendo funzionare il seguente codice di prova:PHP: problemi di conversione del carattere "" "da ISO-8859-1 a UTF-8

// Connect to a latin1 charset database 
// and retrieve "Georgia O’Keeffe", which contains a "’" character 
$connection = mysql_connect('*****', '*****', '*****'); 
mysql_select_db('*****', $connection); 
mysql_set_charset('latin1', $connection); 
$result = mysql_query('SELECT notes FROM categories WHERE id = 16', $connection); 
$latin1Str = mysql_result($result, 0); 
$latin1Str = substr($latin1Str, strpos($latin1Str, 'Georgia'), 16); 

// Try to convert it to UTF-8 
$utf8Str = iconv('ISO-8859-1', 'UTF-8', $latin1Str); 

// Output both 
var_dump($latin1Str); 
var_dump($utf8Str); 

Quando ho eseguito questo in vista origine di Firefox, assicurandosi impostazione di codifica di Firefox è impostato su "occidentale (ISO-8859-1)", ottengo questo:

asd

Finora, tutto bene. Il primo output contiene quella citazione strana e posso vederlo correttamente perché è in ISO-8859-1 e così è Firefox.

Dopo essere passato ad impostazione "UTF-8", sembra che questa codifica di Firefox:

asd

Dove ha fatto la citazione andare? iconv() non doveva convertirlo in UTF-8?

risposta

14

U + 2019 IL MARCHIO DI QUOTAZIONE SINGOLA DESTRA non è un carattere in ISO-8859-1. È un carattere in windows-1252, come 0x92. Il carattere effettivo ISO-8859-1 0x92 è un raramente usato C1 control character chiamato "Uso privato 2".

E 'molto comune per mislabel dati di testo di Windows-1252 con l'etichetta di charset ISO-8859-1. Molti web browser e client di posta elettronica trattare la MIME charset ISO-8859-1 come caratteri di Windows-1252, al fine di accogliere tale mislabeling ma è comportamento non normale e la cura dovrebbe essere prese per evitare di generare questi caratteri in ISO-8859-1 con etichetta contenuto.

Sembra che questo stia succedendo qui. Cambia "ISO-8859-1" in "windows-1252".

+0

Wow, ho fatto e vedo la U + 2019 in modalità UTF-8! Ma è sicuro usare "windows-1252" per convertire una grande quantità di dati da "ISO-8859-1" a "UTF-8"? In altre parole, tutti i caratteri ISO-8859-1 continueranno a essere convertiti correttamente? – mattalxndr

+1

I caratteri 0x80-0x9F non verranno convertiti correttamente. Ma questi sono caratteri di controllo che non vengono quasi mai usati. – dan04

+1

@mattalexx Se si controlla la stringa per i caratteri in quell'intervallo e ne trovi uno, è una buona scommessa che la stringa sia codificata in Windows-1252. Se ** non ** trovi caratteri in quell'intervallo, è più probabile che sia ISO-8859-1. –

0

questo risolverà il problema, supponendo che la tua pagina di intestazione charset è utf-8:

// Opens a connection to a MySQL server 
$connection = mysql_connect ($server, $username, $password); 
$charset = mysql_client_encoding($connection); 
$flagChange = mysql_set_charset('utf8', $connection); 
echo "The character set is: $charset</br>mysql_set_charset result:$flagChange</br>";