Come evitare di ripetere il carattere 65279 in php? (Questa domanda si riferisce anche a Javascript xmlhttp.responseText (ajax))

Ho incontrato un problema simile descritto qui (e in altri luoghi) – where come su un callback ajax ho un xmlhttp.responseText che sembra ok (quando lo avviso – mostra il text giusto) – ma quando si utilizza un 'se' per confrontarlo con la string – restituisce false.

(Io sono anche colui che ha scritto il codice lato server che restituisce quella string) – dopo aver studiato molto la string – ho scoperto che la string aveva un carattere "invisibile" come suo primo personaggio. Un carattere non visualizzato. Se l'ho copiata in Blocco note – quindi ho eliminato il primo carattere – non verrà eliminato finché non viene nuovamente premuto il button Elimina.

Ho fatto un charCodeAt (0) per la string restituita in xmlhttp.responseText. Ed è tornato 65279 .

Googling rivela che è una sorta di un carattere di controllo UTF-8 che dovrebbe impostare la codifica "big-endian" o "small-endian".

Quindi, adesso so la causa del problema – ma … perchè questo personaggio viene echeggiato? Nella sorgente php che uso semplicemente

echo 'the string'... 

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

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 utf-8 codifica.

PHP non sembra essere disturbato da esso – a less che non includiate un file php in un altro – allora le cose diventano disordinate e le stringhe vengono visualizzate con il carattere (65279) aggiunto a loro.

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

Inoltre, è ansible salvare l'altro file php con codifica ANSI nel block note – e questo sembra funzionare (cioè, nel caso in realtà non si usino caratteri estesi nel file, immagino …)

Puoi anche rimuovere il carattere in javascript con:

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

Se si desidera printingre una string che contiene il carattere ZERO WIDTH NO-BREAK SPACE (ad esempio includendo un file esterno non PHP), provare il seguente codice:

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

Se stai utilizzando Linux o Mac, qui è una soluzione elegante per sbarazzarsi del carattere in PHP.

Se si utilizza WordPress (il 25% dei siti Internet è alimentato da WordPress), le probabilità sono che un plugin o il tema attivo introducano il carattere BOM a causa di un file che contiene BOM (forse questo file è stato modificato in Windows). Se questo è il caso, vai al tuo wp-content / themes / folder e esegui il seguente command:

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

Questo cercherà i file con BOM. Se hai i risultati .php nell'elenco, fai questo:

  1. Rinominare il file a qualcosa come filename.bom.bak.php
  2. Apri il file nell'editor e copia il contenuto nel clipboard.
  3. Creare un nuovo file e incollare il contenuto negli Appunti.
  4. Salvare il file con il nome originale filename.php

Se hai a che fare con questo in locale, poi alla fine dovresti ricaricare nuovamente i file sul server.

Se non si hanno risultati dopo aver eseguito il command grep e si utilizza WordPress, un altro luogo per controllare i file BOM è la cartella / wp-content / plugins. Andateci e fai nuovamente il command. In alternativa, è ansible avviare la distriggerszione di tutti i plugin e verificare se il problema viene risolto mentre si triggers nuovamente i plugin.

Se non si utilizza WordPress, andare alla radice della cartella di progetto e eseguire il command per trovare i file con BOM. Se si trova un file, eseguire la procedura di quattro passaggi descritta in precedenza.

Oltre a quanto sopra, ho appena avuto questo problema quando ho tirato alcuni dati da un database MySQL (charset è impostato su UTF-8) – il problema è il tag HTML, ho permesso alcuni elementi di base come <p> e <a> quando L'ho visualizzata sulla pagina, ho il carattere & # 65729 che guarda attraverso Dev Tools in Chrome.

Così ho rimosso i tag dalla tabella e che ho rimosso il problema & # 65729 (e la row vuota sopra where dovrebbero essere visualizzati il ​​text.

Volevo solo aggiungere questo, dal momento che il mio Rep non è abbastanza alto per commentare in realtà la risposta.

EDIT: Utilizzo di VIM Sono riuscito a rimuovere la BOM con :set nobomb e potrai confermare la presenza della BOM con :set bomb? che mostrerà la bomb o la nobomb

Ho avuto questo problema e ho cambiato la mia codifica a utf-8 senza bom, Ansi, ecc senza fortuna. Il mio problema è stato causato dall'utilizzo di una function php include nel corpo html. Spostamento della function di inserimento sopra il mio html (sopra il tag DOCTYPE) ha risolto il problema.

Dopo che ho conosciuto il mio problema che ho testato include, include_once e richiedono funzioni. Tutti i tentativi di includere un file dall'interno del corpo html hanno creato il carattere aggiuntivo 𐃁 diverso nel punto in cui inizierebbe il codice PHP.

Ho anche cercato di assegnare il risultato dell'inclusione a una variabile … cioè $ result = include ("myfile.txt"); con lo stesso carattere extra aggiunto

Tieni presente che spostare l'inclusione sopra l'HTML non rimuovere il carattere extra da mostrare, tuttavia lo rimuove dai miei dati e dall'area del contenuto.

Probabilmente qualcosa sul server. Se sai che è lì, l'avrei solo bypassato fino a risolvere.

myString = myString.substring(1)

Spegni il primo carattere.

Io uso "Dreamweaver CC 2015", per impostazione predefinita ha questa opzione abilitata: "includa la firma BOM" o qualcosa di simile, quando fai clic su salva come opzione dal menu file. Nella window che appare, puoi vedere "Opzioni Unicode". È ansible distriggersre l'opzione BOM. E ricordatevi di cambiare tutti i tuoi file come quello. Oppure puoi semplicemente andare alle preferenze e distriggersre l'opzione BOM e salvare tutti i tuoi file.

Quando l'atomo usign è uno spazio bianco all'inizio del documento prima di <?php