Perché effettuare preventivi trasformano in buffi personaggi, se presentate in un modulo HTML?

Ho un form HTML, e alcuni utenti sono copia/incolla di testo da MS Word. Quando ci sono le virgolette singole o doppie virgolette, sarà tradotta in personaggi divertenti come:

‘€™ e ’

Colonna del database è confronto utf8_general_ci.

Come faccio ad ottenere i caratteri appropriati di presentarsi?

Edit:
Problema risolto. Ecco come ho risolto:

Corse mysql_query("SET NAMES 'utf8'"); prima di aggiungere/retreiving dal database. (grazie a Donal commento qui sotto).

E un po ‘ dispari, la funzione php urlencode($text) è stato applicato durante la visualizzazione, in modo che doveva essere rimosso.

Ho anche fatto in modo che le intestazioni di pagina e l’ajax di richiesta/risposta sono stati tutti utf8.

  • MS Word modifiche virgolette in “virgolette inglesi”, che sono tutt’altro che intelligente. Utilizzare un Microsoft “codice pagina” invece di Unicode.
  • Si noterà questo con alcuni trattini troppo.
  • Se tutte le codifiche sono specificati correttamente, questi devono essere convertiti automaticamente equivalente Unicode. Dubito che il problema è specifico di Parola; provate a digitare ad esempio Alt+130 (é) direttamente, e vedere se si presenta in modo pulito.
  • C’è qualcosa di strano ’ – sembra che è stato storpiato due volte prima, a un diritto unico preventivo inviate come utf8 a un processo in attesa cp1252; in secondo luogo è stato trasformato di nuovo in utf8 da un po ‘ ingenuo di conversione, che sta lavorando solo sul byte piuttosto che cercando il database Unicode. Se siete in PHP/Mysql, la prima trasformazione potrebbe essere rappresentato dal utf8 essere salvati in un database, senza eseguire prima “set names utf8”, e la seconda trasformazione è ciò che utf8_encode fa.
InformationsquelleAutor Steve | 2009-09-28

 

3 Replies
  1. 26

    Questo si presenta come un classico caso di unicode (UTF-8 più probabile) i caratteri di essere interpretato come iso-8859-1. Ci sono un paio di posti lungo il percorso, dove i personaggi possono ottenere danneggiato. Primo, il browser del client deve inviare i dati. Potrebbe danneggiare i dati, se non è possibile convertire i caratteri correttamente alla pagina di codifica dei caratteri. Quindi il server legge i dati e decodifica i byte in caratteri. Se il client e il server non sono d’accordo con la codifica utilizzata poi i personaggi verranno danneggiati. Quindi i dati vengono memorizzati nel database; di nuovo c’è corruzione. Infine, quando i dati vengono scritti sulla pagina, per visualizzare al browser), il browser potrebbe fraintendere il byte se la pagina non è adeguatamente indicare è la codifica.

    È necessario assicurarsi che si sta utilizzando la codifica UTF-8 in tutto. Il valore di default per le pagine web è iso-8859-1, in modo che le pagine web dovrebbero essere servito con l’intestazione Content-Type o il meta tag

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

    (assicurarsi che realmente serve il testo che codifica).

    Utilizzando la codifica UTF-8, lungo tutte le parti del processo vi permetterà di evitare problemi con tutti i browser web di lavoro e database.

    • +1, c’è un locale correzione di questi problemi, la cosa importante è la mentalità di essere di codifica-aware qualsiasi trasmissione o la memorizzazione del testo.
    • Sì, sono d’accordo con @user8599 ….
  2. 7

    Controllare la codifica che la pagina utilizza. Codifica UTF-8, e aggiungere un meta tag che descrive la codifica:

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

    Abbiamo una funzione PHP che cerca di ripulire il pasticcio con virgolette inglesi. E ‘un po’ di confusione, dal momento che è cresciuto un po ‘ organicamente come casi spuntato durante lo sviluppo di prototipi. Può essere di qualche aiuto, però:

    function convert_smart_quotes($string) {
        $search = array(chr(0xe2) . chr(0x80) . chr(0x98),
                        chr(0xe2) . chr(0x80) . chr(0x99),
                        chr(0xe2) . chr(0x80) . chr(0x9c),
                        chr(0xe2) . chr(0x80) . chr(0x9d),
                        chr(0xe2) . chr(0x80) . chr(0x93),
                        chr(0xe2) . chr(0x80) . chr(0x94),
                        chr(226) . chr(128) . chr(153),
                        '’','“','â€<9d>','â€"','  ');
    
         $replace = array("'","'",'"','"',' - ',' - ',"'","'",'"','"',' - ',' ');
    
        return str_replace($search, $replace, $string);
    }
    
    • Questo l’ho fatto io a me stesso, ma penso che sia una cattiva idea. Se si dispone di un testo, di processo o di qualsiasi altro tipo di processo che danneggia i vostri dati, correggere il processo in modo da non danneggiare i dati, non solo rendono frammentaria correzioni all’uscita.
    • Sì – la metà di un decennio più tardi. Mi sono imbattuto su questo, come mi è stato mantenere il codice esistente. Ho saputo del taglia/incolla problemi da programmi come Word, ma a sostegno di @mike-una su di esso, a volte non riesci a controllare la fonte delle informazioni, e si deve prendere una normalizzazione approccio per il vostro flusso di dati. Ho usato questo, e aggiunto uno in più per • (primo livello di proiettili che ho avuto).

Lascia un commento