2011-12-29 9 views
6

Sfondo rapida: Ho ereditato un grande file di dump SQL che contiene una combinazione di testo inglese e arabo e (credo) è stato originariamente esportato usando 'latin1'. Ho cambiato tutte le occorrenze di 'latin1' in 'utf8' prima di importare il file. Il testo arabo non viene visualizzato correttamente in phpMyAdmin (che credo sia normale), ma quando ho caricato il testo a una pagina Web con il seguente ...arabo codifica dei caratteri Problema: UTF-8 contro Windows-1256

<meta http-equiv='Content-Type' content='text/html; charset=windows-1256'/> 

... tutto sembrava buono e il testo arabo visualizzato perfettamente.


Problema: Il mio cliente è davvero molto esigente e non vuole cambiare la sua ...

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> 

... all'equivalente 'Windows-1256'. Non pensavo che questo sarebbe stato un problema, ma quando ho cambiato il valore del set di caratteri in "UTF-8", tutti i caratteri arabi apparivano come diamanti con punti interrogativi. UTF-8 non dovrebbe visualizzare correttamente il testo arabo?


Ecco alcune note sulla mia configurazione del database:

  • charset Database 'utf8'
  • Database connessione collazione è 'utf8_general_ci'
  • tutti i database, tabelle e campi applicabili hanno stato collazionato come 'utf8_general_ci'

Sto setacciando stack overflow e altri forum per tutto ciò che riguarda al mio problema Ho riscontrato problemi simili, ma non sembra che le soluzioni funzionino per la mia situazione specifica. Spero che qualcuno possa aiutarti!

+0

Hai salvato utilizzando il Blocco note? Se questo è il caso, assicurati di aver scelto UTF-8 come codifica anziché ANSI, altrimenti potresti perdere i tuoi caratteri arabi. – SiN

risposta

2

Non possiamo trovare l'errore nel codice se non ci mostri il tuo codice, quindi siamo molto limitati su come possiamo aiutarti.

Hai detto al browser di interpretare il documento come UTF-8 anziché Windows-1256, ma hai effettivamente modificato la codifica utilizzata da Windows-1256 a UTF-8?

Per esempio,

$ cat a.pl 
use strict; 
use warnings; 
use feature qw(say); 
use charnames ':full'; 

my $enc = $ARGV[0] or die; 
binmode STDOUT, ":encoding($enc)"; 

print <<"__EOI__"; 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=$enc"> 
<title>Foo!</title> 
</head> 
<body dir="rtl"> 
\N{ARABIC LETTER ALEF}\N{ARABIC LETTER LAM}\N{ARABIC LETTER AIN}\N{ARABIC LETTER REH}\N{ARABIC LETTER BEH}\N{ARABIC LETTER YEH}\N{ARABIC LETTER TEH MARBUTA} 
</body> 
</html> 
__EOI__ 

$ perl a.pl UTF-8 > utf8.html 

$ perl a.pl Windows-1256 > cp1256.html 
+0

Oops, ho pensato che fosse una domanda Perl. L'idea si applica anche se l'esempio è in Perl. La codifica utilizzata deve corrispondere alla codifica specificata. – ikegami

3

Se il documento sembra giusto quando dichiarato come codificato finestre-1256, quindi molto probabilmente è finestre-1256 codificato. Quindi apparentemente non è stato esportato usando latin1, il che sarebbe stato impossibile, dal momento che latin1 non ha lettere arabe.

Se questo è solo un singolo file, il modo più semplice è convertirlo dalla codifica windows-1256 alla codifica utf-8, utilizzando ad es. Notepad++. (Apri il file al suo interno, cambia la codifica, tramite il menu Formato file, in arabo, windows-1256. Quindi seleziona Converti in UTF-8 nel menu Formato file e fai File → Salva.)

Windows-1256 e Le UTF-8 sono codifiche completamente diverse, quindi i dati vengono tutti incasinati se si dichiarano i dati di Windows-1256 come UTF-8 o viceversa. Solo i caratteri ASCII, come le lettere inglesi, hanno la stessa rappresentazione in entrambe le codifiche.

2

Penso che sia necessario tornare al punto di partenza.Sembra che tu abbia un dump del database nella codifica Win-1256 e che tu voglia lavorare con esso in UTF-8 d'ora in poi. Sembra anche che tu stia usando PHP, ma nella tua domanda ci sono molti tag irrilevanti e manca il più importante, PHP.

In primo luogo, è necessario convertire il dump di testo in UTF-8 e si dovrebbe essere in grado di farlo con PHP. È probabile che lo script di conversione abbia due passaggi, in primo luogo leggere i byte Win-1256 e decodificarli in stringhe di testo Unicode interne, quindi codificare le stringhe di testo Unicode in byte UTF-8 per l'output in un nuovo file di testo.

Una volta fatto, ripetere l'importazione del database come in precedenza, ma ora hai codificato correttamente i dati di input come UTF-8.

Dopodiché dovrebbe essere semplice come leggere il database e eseguire il rendering di una pagina Web con la codifica UTF-8 corretta.

P.S. In realtà è possibile ricodificare i dati ogni volta che li si visualizza, ma ciò non risolve il problema di avere un database pieno di dati codificati erroneamente.

0

inorder per visualizzare i caratteri arabi correttamente, è necessario convertire il file php in UTF-8 senza Bom questo è accaduto a me, caratteri arabi è stato visualizzato diamanti, ma la conversione in UTF-8 senza BOM risolverà questo problema