Come evitare di echeggiare il carattere 65279 in PHP? (Questa domanda riguarda anche Javascript xmlhttp.responseText (ajax))

Ho riscontrato un problema simile descritto qui (e in altri luoghi) – dove come su un callback ajax ottengo un xmlhttp.responseText che sembra ok (quando lo allarme – mostra il testo giusto) – ma quando si usa un ‘se’ dichiarazione per confrontarlo con la stringa – restituisce false.

(Sono anche quello che ha scritto il codice lato server restituendo quella stringa) – dopo aver studiato molto la stringa – ho scoperto che la stringa aveva un “carattere invisibile” come primo carattere. Un personaggio che non è stato mostrato. Se l’ho copiato su Blocco note – quindi cancellato il primo carattere – non verrà eliminato fino a quando non si preme nuovamente Elimina.

Ho fatto un charCodeAt (0) per la stringa restituita in xmlhttp.responseText. E ha restituito 65279 .

Googling rivela che si tratta di una sorta di carattere di controllo UTF-8 che dovrebbe impostare la codifica “big-endian” o “small-endian”.

Quindi, ora conosco la causa del problema – ma … perché viene fatto eco a quel personaggio? Nel php sorgente che uso semplicemente

echo 'the string'... 

e apparentemente in qualche modo emette [chr (65279)] la stringa …

Perché? E come posso evitarlo?

Per concludere, e specificare la soluzione:

Blocco note di Windows aggiunge il carattere BOM (i 3 byte: EF BB BF) ai file salvati con la codifica utf-8.

PHP non sembra essere disturbato da esso – a meno che non si includa un file php in un altro – quindi le cose si complicano e le stringhe vengono visualizzate con carattere (65279) anteposto a loro.

È ansible modificare il file con un altro editor di testo come Notepad ++ e utilizzare la codifica
“Codifica in UTF-8 senza BOM”,
e questo sembra risolvere il problema.

Inoltre, puoi salvare l’altro file php con la codifica ANSI nel blocco note – e anche questo sembra funzionare (nel caso in cui in realtà non utilizzi caratteri estesi nel file, immagino …)

Se vuoi stampare una stringa che contiene il carattere ZERO WIDTH NO-BREAK SPACE (ad esempio, includendo un file non PHP esterno), prova il seguente codice:

 echo preg_replace("/\xEF\xBB\xBF/", "", $string); 

Se stai usando Linux o Mac, ecco una soluzione elegante per liberarti del personaggio in PHP.

Se utilizzi WordPress (il 25% dei siti Internet è alimentato da WordPress), è probabile che un plug-in o il tema attivo introducano il carattere BOM a causa di un file che contiene BOM (forse il file è stato modificato in Windows). In questo caso, vai alla tua cartella wp-content / themes / ed esegui il seguente comando:

 grep -rl $'\xEF\xBB\xBF' . 

Questo cercherà i file con BOM. Se hai risultati .php nella lista, allora fai questo:

  1. Rinominare il file in qualcosa come filename.bom.bak.php
  2. Apri il file nel tuo editor e copia il contenuto nella clipbard.
  3. Crea un nuovo file e incolla il contenuto dagli appunti.
  4. Salva il file con il nome originale nomefile.php

Se hai a che fare con questo in locale, alla fine dovrai ricaricare i nuovi file sul server.

Se non si ottengono risultati dopo aver eseguito il comando grep e si sta utilizzando WordPress, un altro posto per controllare i file BOM è la cartella / wp-content / plugins. Vai lì ed esegui di nuovo il comando. In alternativa, puoi iniziare a distriggersre tutti i plugin e quindi verificare se il problema viene risolto mentre attivi nuovamente i plugin.

Se non si utilizza WordPress, andare alla directory principale della cartella del progetto ed eseguire il comando per trovare i file con BOM. Se viene trovato un qualsiasi file, quindi eseguire la procedura di quattro passaggi descritta sopra.

Puoi anche rimuovere il personaggio in javascript con:

myString = myString.replace(String.fromCharCode(65279), "" );

In aggiunta a quanto sopra, ho appena avuto questo problema quando ho tirato alcuni dati da un database MySQL (il set di caratteri è impostato su UTF-8) – il problema sono i tag HTML, ho permesso alcuni di base come

e quando L’ho visualizzato sulla pagina, ho ottenuto il carattere & # 65729 guardando attraverso Dev Tools in Chrome.

Così ho rimosso i tag dalla tabella e ho rimosso il problema & # 65729 (e la riga vuota sopra la posizione in cui il testo doveva essere visualizzato.

Volevo solo aggiungere a questo, dal momento che il mio rappresentante non è abbastanza alto per commentare effettivamente la risposta.

EDIT: Usando VIM sono stato in grado di rimuovere il BOM con :set nobomb e puoi confermare la presenza del BOM con :set bomb? che mostrerà bomb o nobomb

Ho avuto questo problema e ho cambiato la mia codifica in utf-8 senza bom, Ansi, ecc senza fortuna. Il mio problema è stato causato dall’uso di una funzione di inclusione di php nel corpo html. Lo spostamento della funzione include sopra il mio html (sopra! Tag DOCTYPE) ha risolto il problema.

Dopo aver saputo che il mio problema ho testato include, include_once e richiedono funzioni. Tutti i tentativi di includere un file all’interno del corpo html hanno creato il carattere misc extra extra nel punto in cui il codice PHP avrebbe avuto inizio.

Ho anche provato ad assegnare il risultato dell’inserimento a una variabile … cioè $ result = include (“myfile.txt”); con lo stesso carattere in più aggiunto

Tieni presente che spostare l’inclusione sopra l’HTML non rimuoverà il carattere in eccesso dalla visualizzazione, ma lo rimuove dai miei dati e dall’area del contenuto.

Uso “Dreamweaver CC 2015”, per impostazione predefinita ha questa opzione abilitata: “include firma BOM” o qualcosa del genere, quando si fa clic su Salva come opzione dal menu file. Nella finestra visualizzata, puoi vedere “Opzioni Unicode ..”. È ansible disabilitare l’opzione DBA. E ricorda di cambiare tutti i tuoi file in quel modo. Oppure puoi semplicemente andare alle preferenze e disabilitare l’opzione BOM e salvare tutti i tuoi file.

Probabilmente qualcosa sul server. Se sai che è lì, vorrei bypassarlo fino a quando non è risolto.

myString = myString.substring(1)

Elimina il primo personaggio.

Quando si usa atom è uno spazio bianco all’inizio del documento prima di