Bagaimana cara menghapus ï »¿dari awal file?


145

Saya memiliki file CSS yang terlihat bagus ketika saya membukanya menggunakan gedit , tetapi ketika itu dibaca oleh PHP (untuk menggabungkan semua file CSS menjadi satu), CSS ini memiliki karakter berikut yang ditambahkan ke dalamnya: ï »¿

PHP menghapus semua spasi putih, jadi ï »¿acak di tengah kode mengacaukan semuanya. Seperti yang saya sebutkan, saya tidak bisa benar-benar melihat karakter ini ketika saya membuka file di gedit, jadi saya tidak bisa menghapusnya dengan mudah.

Saya mencari masalah di Google, dan jelas ada sesuatu yang salah dengan penyandian file, yang masuk akal karena saya telah menggeser file-file tersebut ke berbagai server Linux / Windows melalui ftp dan rsync , dengan berbagai editor teks. Saya tidak benar-benar tahu banyak tentang pengkodean karakter, jadi bantuan akan dihargai.

Jika itu membantu, file tersebut disimpan dalam format UTF-8, dan gedit tidak akan membiarkan saya menyimpannya dalam format ISO-8859-15 (dokumen berisi satu atau lebih karakter yang tidak dapat dikodekan menggunakan pengkodean karakter yang ditentukan). Saya mencoba menyimpannya dengan Windows dan Linux, tetapi tidak ada yang membantu.


Ini muncul untuk menyelesaikan masalah. 95isalive.com/expression/index.html

30
Seseorang melepaskan kami dari BOM
David Heffernan

Jawaban:


151

Tiga kata untuk Anda:

Tanda Pesanan Byte (BOM)

Itulah representasi untuk BOM UTF-8 di ISO-8859-1. Anda harus memberi tahu editor Anda untuk tidak menggunakan BOM atau menggunakan editor lain untuk menghapusnya.

Untuk secara otomatis menghapus BOM Anda dapat menggunakan awkseperti yang ditunjukkan dalam pertanyaan ini .

Seperti jawaban lain mengatakan , yang terbaik adalah PHP benar-benar menafsirkan BOM dengan benar, untuk itu Anda dapat menggunakan mb_internal_encoding(), seperti ini:

 <?php
   //Storing the previous encoding in case you have some other piece 
   //of code sensitive to encoding and counting on the default value.      
   $previous_encoding = mb_internal_encoding();

   //Set the encoding to UTF-8, so when reading files it ignores the BOM       
   mb_internal_encoding('UTF-8');

   //Process the CSS files...

   //Finally, return to the previous encoding
   mb_internal_encoding($previous_encoding);

   //Rest of the code...
  ?>

Ya saya menemukan itu ketika saya meng-Google-nya, tetapi bagaimana cara menghapusnya?
Matt

10
Itu tidak menghapus BOM, itu mengabaikannya.
Cole Johnson

Atau cara lain (abaikan) bisa dengan mengubah encoding.
mr5

Windows Notepad (ugh) menambahkannya; saran dari dup pertanyaan ini adalah menggunakan Notepad ++, yang memungkinkan pengaturan "UTF-8 tanpa BOM" sebagai penyandian. Atau gunakan Editor Sungguhan ... (emacs!) :-)
jesup

2
Persis itulah masalahnya, pengkodean karakter yang berbeda menggunakan byte yang berbeda untuk karakter yang sama. Baca lagi paragraf ketiga dari jawabannya.
Vinko Vrsalovic

24

Buka file Anda di Notepad ++ . Dari menu Pengkodean , pilih Konversi ke UTF-8 tanpa BOM , simpan file, ganti file lama dengan file baru ini. Dan itu akan berhasil, tentu saja.


1
Di Notepad ++ v7.6.6 (64-bit) Anda perlu mengklik Konversi ke UTF-8 .
stomy

23

Di PHP , Anda dapat melakukan hal berikut untuk menghapus semua karakter non termasuk karakter yang dimaksud.

$response = preg_replace('/[\x00-\x1F\x80-\xFF]/', '', $response);

1
jika Anda hanya ingin mematikan "ï" gunakan $ response = preg_replace ('/ [\ x80- \ xFF] //', '', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Anda menambahkan ekstra /, seharusnya:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

Bagi mereka yang memiliki akses shell di sini adalah perintah kecil untuk menemukan semua file dengan BOM yang diatur dalam direktori public_html - pastikan untuk mengubahnya ke jalur yang benar di server Anda

Kode:

grep -rl $'\xEF\xBB\xBF' /home/username/public_html

dan jika Anda merasa nyaman dengan editor vi , buka file di vi:

vi /path-to-file-name/file.php

Dan masukkan perintah untuk menghapus BOM:

set nobomb

Simpan file:

wq

1
Gunakan grep -rlI $'\xEF\xBB\xBF' .untuk mengabaikan file biner.
Nabi KAZ

11

BOM hanyalah serangkaian karakter ($ EF $ BB $ BF untuk UTF-8), jadi hapus saja menggunakan skrip atau konfigurasikan editor sehingga tidak ditambahkan.

Dari Menghapus BOM dari UTF-8 :

#!/usr/bin/perl
@file=<>;
$file[0] =~ s/^\xEF\xBB\xBF//;
print(@file);

Saya yakin itu diterjemahkan ke PHP dengan mudah.


6
Perhatikan bahwa BOM bukan urutan karakter, melainkan karakter tunggal. Jika file dalam UTF-8, maka karakter diwakili dalam tiga byte . Jika file dalam UTF-8, kemudian melihatnya dalam pengkodean lain (yaitu, di mana EF BB BF muncul di mana BOM seharusnya) adalah kesalahan. Untuk menghapus BOM dari file UTF-8, orang harus menghapus (tunggal) charcter U + FEFF. Ya, pedantry!
Jeffrey L Whitledge

1
Saya tidak bisa menggunakannya di PHP (itu hanya ketidakmampuan saya, bukan milik Anda: P), jadi saya melakukan pemeriksaan untuk melihat apakah BOM ada di sana dan menghapus 3 karakter pertama. Inilah kodenya, jika ada yang membutuhkannya: if (substr ($ css, 0,3) == paket ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt

7
itu diterjemahkan ke php sebagai $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. sebelum Anda menggunakan ini, pertimbangkan kembali jika Anda tidak dapat memperbaiki masalah di sumbernya.
commonpike

6

Bagi saya, ini berhasil:

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

Jika saya menghapus meta ini, ï »¿muncul lagi. Semoga ini bisa membantu seseorang ...


5

Saya tidak tahu PHP, jadi saya tidak tahu apakah ini mungkin, tetapi solusi terbaik adalah membaca file sebagai UTF-8 daripada beberapa pengkodean lainnya. BOM sebenarnya adalah NOL WIDTH NO BREAK SPACE. Ini adalah spasi putih, jadi jika file sedang dibaca dalam pengkodean yang benar (UTF-8), maka BOM akan ditafsirkan sebagai spasi putih dan itu akan diabaikan dalam file CSS yang dihasilkan.

Juga, keuntungan lain dari membaca file dalam pengkodean yang benar adalah bahwa Anda tidak perlu khawatir tentang karakter yang disalahtafsirkan. Editor Anda memberi tahu Anda bahwa halaman kode yang ingin Anda simpan tidak akan melakukan semua karakter yang Anda butuhkan. Jika PHP kemudian membaca file dalam pengkodean yang salah, maka sangat mungkin bahwa karakter lain selain BOM sedang diam-diam disalahartikan. Gunakan UTF-8 di mana-mana, dan masalah ini hilang.


3

Kamu bisa memakai

vim -e -c 'argdo set fileencoding=utf-8|set encoding=utf-8| set nobomb| wq'

Mengganti dengan awk tampaknya berhasil, tetapi tidak pada tempatnya.


2

grep -rl $ '\ xEF \ xBB \ xBF' * | xargs vim -e -c 'argdo set fileencoding = utf-8 | set encoding = utf-8 | atur nobomb | wq '


Gunakan grep -rlI $'\xEF\xBB\xBF' .untuk mengabaikan file biner. Dan juga .lebih baik dari *sini.
Nabi KAZ

2

Saya memiliki masalah yang sama dengan BOM muncul di beberapa file PHP saya (ï »¿ï» ¿).

Jika Anda menggunakan PhpStorm Anda dapat mengatur di hotkey untuk menghapusnya di Pengaturan -> Pengaturan IDE -> Keymap -> Menu Utama -> File -> Hapus BOM.



2

Buka file PHP yang dimaksud, di Notepad ++.

Klik Encoding di bagian atas dan ubah dari "Encoding di UTF-8 tanpa BOM" menjadi "Encoding di UTF-8". Simpan dan timpa file di server Anda.


1

Masalah yang sama, solusi berbeda.

Satu baris dalam file PHP sedang mencetak header XML (yang menggunakan tag awal / akhir yang sama dengan PHP). Sepertinya kode di dalam tag ini mengatur pengodean, dan dieksekusi dalam PHP yang menghasilkan karakter aneh. Bagaimanapun, inilah solusinya:

# Original
$xml_string = "&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;";

# fixed
$xml_string = "<" . "?xml version=\"1.0\" encoding=\"UTF-8\"?" . ">";

1

Jika Anda harus dapat menghapus BOM dari file yang disandikan UTF-8, pertama-tama Anda perlu menghubungi editor yang menyadarinya.

Saya pribadi menggunakan E Text Editor .

Di kanan bawah, ada opsi untuk pengkodean karakter, termasuk tag BOM. Muat file Anda, batalkan pilihan Byte Order Marker jika dipilih, simpan kembali, dan itu harus dilakukan.

Alt text http://oth4.com/encoding.png

E tidak gratis, tetapi ada uji coba gratis, dan ini adalah editor yang sangat baik ( kompatibilitas TextMate terbatas ).


1
Tautan gambar rusak.
Peter Mortensen


1

Berikut ini solusi lain yang bagus untuk masalah BOM. Ini adalah dua skrip VBScript (.vbs).

Satu untuk menemukan BOM dalam file dan satu untuk MEMBUNUH BOM terkutuk dalam file. Ini bekerja dengan sangat baik dan mudah digunakan.

Cukup buat file .vbs, dan rekatkan kode berikut di dalamnya.

Anda dapat menggunakan skrip VBScript hanya dengan menyeret dan menjatuhkan file yang mencurigakan ke file .vbs. Ini akan memberi tahu Anda apakah ada BOM atau tidak.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' find_BOM.vbs
' ====================
' Kleines Hilfsmittel, welches das BOM finden soll
'
 Const UTF8_BOM = ""
 Const UTF16BE_BOM = "þÿ"
 Const UTF16LE_BOM = "ÿþ"
 Const ForReading = 1
 Const ForWriting = 2
 Dim fso
 Set fso = WScript.CreateObject("Scripting.FileSystemObject")
 Dim f
 f = WScript.Arguments.Item(0)
 Dim t
 t = fso.OpenTextFile(f, ForReading).ReadAll
 If Left(t, 3) = UTF8_BOM Then
     MsgBox "UTF-8-BOM detected!"
 ElseIf Left(t, 2) = UTF16BE_BOM Then
     MsgBox "UTF-16-BOM (Big Endian) detected!"
 ElseIf Left(t, 2) = UTF16LE_BOM Then
     MsgBox "UTF-16-BOM (Little Endian) detected!"
 Else
     MsgBox "No BOM detected!"
 End If

Jika itu memberi tahu Anda ada BOM, pergi dan buat file .vbs kedua dengan kode berikut dan seret file suspicios ke file .vbs.

' Heiko Jendreck - personal helpdesk & webdesign
' http://www.phw-jendreck.de
' 2010.05.10 Vers 1.0
'
' kill_BOM.vbs
' ====================
' Kleines Hilfmittel, welches das gefundene BOM löschen soll
'
Const UTF8_BOM = ""
Const ForReading = 1
Const ForWriting = 2
Dim fso
Set fso = WScript.CreateObject("Scripting.FileSystemObject")
Dim f
f = WScript.Arguments.Item(0)
Dim t
t = fso.OpenTextFile(f, ForReading).ReadAll
If Left(t, 3) = UTF8_BOM Then
    fso.OpenTextFile(f, ForWriting).Write (Mid(t, 4))
    MsgBox "BOM gelöscht!"
Else
    MsgBox "Kein UTF-8-BOM vorhanden!"
End If

Kode ini dari Heiko Jendreck .


1

Dalam PHPStorm, untuk banyak file dan BOM tidak harus di awal file, Anda dapat mencari \x{FEFF}(Ekspresi Reguler) dan menggantinya dengan nol.


0

Masalah yang sama, tetapi hanya mempengaruhi satu file jadi saya baru saja membuat file kosong, menyalin / menempelkan kode dari file asli ke file baru, dan kemudian mengganti file asli. Tidak suka tapi berhasil.



0

Saya memiliki masalah yang sama. Masalahnya adalah karena salah satu file php saya ada di utf-8 (yang paling penting, file konfigurasi yang termasuk dalam semua file php).

Dalam kasus saya, saya memiliki 2 solusi berbeda yang bekerja untuk saya:

Pertama, saya mengubah Konfigurasi Apache dengan menggunakan AddDefaultCharsetDirective dalam file konfigurasi (atau dalam .htaccess). Solusi ini memaksa Apache untuk menggunakan enkode yang benar.

AddDefaultCharset ISO-8859-1

Solusi kedua adalah mengubah penyandian file php yang buruk.


0
  1. Salin teks file filename.css Anda.
  2. Tutup file css Anda.
  3. Ganti nama itu namafile2.css untuk menghindari bentrok namafile.
  4. Di MS Notepad atau Wordpad, buat file baru.
  5. Rekatkan teks ke dalamnya.
  6. Simpan sebagai namafile.css, pilih UTF-8 dari opsi enkode.
  7. Unggah filename.css.

-3

Periksa Anda index.php, cari "... charset=iso-8859-1" dan ganti dengan "... charset=utf-8".

Mungkin itu akan berhasil.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.