Domanda

Io, come molti altri sviluppatori di PHP, ho avuto problemi con la codifica dei personaggi, la domanda descriverà i passaggi che faccio per garantire che i miei dati vengano salvati e emessi come UTF8. Vorrei qualsiasi consiglio su cos'altro dovrei considerare e o cambiare con il mio pensiero attuale.

Ho un database MySQL DEFAULT CHARACTER UTF-8 Le mie tabelle hanno una raccolta di utf8_general_ci

Sto usando uno script PHP per leggere i dati da un feed RSS, quindi salvo tali dati per database. Prima di salvare quei dati che verificherò se quei dati sono UTF-8 o meno facendo quanto segue:

protected function _convertToUTF8($content) {
    $enc = mb_detect_encoding($content);
    return mb_convert_encoding($content, "UTF-8", $enc);
}

Quando si supera questi dati in una pagina Web, imposto le intestazioni in PHP

header("Content-type: text/html; charset=utf-8");

E ho anche impostato il meta tag di tipo contenuto essere UTF-8

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

Finora tutto funziona come previsto, non ricevo personaggi divertenti e tutto va bene, ma dovrei cambiare/considerare qualcos'altro quando ho a che fare con questi dati?

Il problema che sto avendo ora sta producendo questi dati in un file TXT (CSV) che sto usando fwrite () che ha creato correttamente il file ma la terza parte a cui sto passando questo file dice che il file non è UTF-8. Non sono sicuro che i dati vengano emessi come UTF-8, come posso controllarlo? Quando sono acceduto al server remoto su ssh e ottengo il file che ottengo Itâs a Quando ho il file che ottengo Itâ~@~Ys Quando ho meno il file che ottengo It<E2><80><99>s. Cosa mi manca qui?

Grazie in anticipo!

È stato utile?

Soluzione 2

Alla fine era necessario un BOM che era necessario per l'applicazione esterna di leggere correttamente il file.

Altri suggerimenti

Non è possibile rilevare la codifica di alcun dati. La codifica è sempre meta-informazione accanto ai dati stessi.

Persino mb_detect_encoding() Cerca che è meglio farlo, non dovresti mai usarli per gestire automaticamente i dati. Perché poiché non è possibile rilevare la codifica dai dati stessi, questa funzione non può anche.

Non fare affidamento su di esso. Usalo solo per l'ispezione manuale nel caso in cui sia necessario eseguire il debug di un problema o nell'ultima risorsa di fallback, ma mai nelle elaborazioni dei dati standard. Anche allora, non fidarti troppo di tali informazioni.

Come posso dirlo? Solo un esempio: un testo può essere validamente codificato USA-ASCII e una routine di rilevamento per UTF-8 restituirà che è codificato UTF-8 valido. E questo è solo un esempio. La verità è che questo è solo molto più complesso.

Quindi dare per scontato che non è possibile rilevare la codifica dai dati grezzi.

Invece, cerca le meta informazioni che specificano la codifica. Se non vengono fornite informazioni sulla codifica, cercare la codifica predefinita nei documenti di specifica per il trasporto di dati.

Nel caso di archiviazione dei dati dai feed RSS, cerca le informazioni nelle intestazioni di risposta e/o nel prologo XML. Normalmente contiene la codifica nella notazione ISO del documento.

Poiché il database prevede che i dati codificati come UTF-8 l'elaborazione deve essere curata che solo i dati UTF-8 vengano inseriti nel database. Quindi controlla e acquisisci la codifica dei dati e quindi esegui i passaggi necessari per modificare la codifica. Ma non fare affidamento mb_detect_encoding() Per eseguire questi passaggi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top