Bir dosyanın başından ï »¿nasıl kaldırırım?


147

Gedit kullanarak açtığımda iyi görünen bir CSS dosyam var , ancak PHP tarafından okunduğunda (tüm CSS dosyalarını tek bir dosyada birleştirmek için), bu CSS'nin başına şu karakterler ekleniyor: ï »¿

PHP tüm boşlukları kaldırır, dolayısıyla kodun ortasındaki rastgele bir "ï» ¿her şeyi karıştırır. Bahsettiğim gibi, dosyayı gedit'te açtığımda aslında bu karakterleri göremiyorum, bu yüzden onları çok kolay silemiyorum.

Sorunu Google'da araştırdım ve dosya kodlamasında açıkça yanlış bir şeyler var, bu da dosyaları bir dizi metin düzenleyicisi ile ftp ve rsync aracılığıyla farklı Linux / Windows sunucularına kaydırdığım için mantıklı . Yine de karakter kodlama hakkında pek bir şey bilmiyorum, bu yüzden yardım için minnettarım.

Yardımcı oluyorsa, dosya UTF-8 biçiminde kaydediliyor ve gedit onu ISO-8859-15 biçiminde kaydetmeme izin vermiyor (belge, belirtilen karakter kodlaması kullanılarak kodlanamayan bir veya daha fazla karakter içeriyor). Windows ve Linux satır sonlarıyla kaydetmeyi denedim, ancak ikisi de yardımcı olmadı.


Bu sorunu çözüyor gibi görünüyor. 95isalive.com/expression/index.html

30
Biri bizi
BOM'dan

Yanıtlar:


151

Senin için üç kelime:

Bayt Sırası İşareti (BOM)

Bu, ISO-8859-1'deki UTF-8 BOM'un temsilidir. Editörünüze BOM'ları kullanmamasını veya bunları çıkarmak için farklı bir düzenleyici kullanmamasını söylemelisiniz.

Ürün reçetesinin kaldırılmasını otomatikleştirmek için bu sorudaawk gösterildiği gibi kullanabilirsiniz .

Başka bir yanıtın da söylediği gibi , en iyisi PHP'nin BOM'u doğru şekilde yorumlamasıdır, bunun için şu şekilde kullanabilirsiniz mb_internal_encoding():

 <?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...
  ?>

Evet, Google'da aradığımda buldum, ama onları nasıl kaldırırım?
Matt

10
Ürün reçetesini kaldırmaz, yok sayar.
Cole Johnson

Veya diğer yol (yok saymak) kodlamayı değiştirmek olabilir.
mr5

Windows Not Defteri (ugh) bunları ekler; Bu sorunun bir kopyasından alınan öneri, kodlama olarak "BOM olmadan UTF-8" ayarına izin veren Notepad ++ 'nın kullanılmasıdır. Veya Gerçek Editör kullanın ... (emacs!) :-)
jesup

2
Sorun tam olarak bu, farklı karakter kodlamaları aynı karakterler için farklı baytlar kullanıyor. Cevabın üçüncü paragrafını tekrar okuyun.
Vinko Vrsalovic

24

Dosyanızı Notepad ++ ile açın . Gönderen Kodlama menüsünden seçmek BOM olmadan UTF-8 Dönüştür dosyayı kaydetmektedir, bu yeni dosya ile eski dosyayı değiştirin. Ve kesinlikle işe yarayacak.


1
Notepad ++ v7.6.6 (64-bit) sürümünde UTF-8'e Dönüştür'e tıklamanız gerekir .
1919

23

In PHP , söz konusu karakteri dahil olmayan tüm karakterleri kaldırmak için aşağıdakileri yapabilirsiniz.

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

1
sadece "ï" 'yı öldürmek istiyorsanız bu $ response = preg_replace (' / [\ x80- \ xFF] // ',' ', $ response);
guido _nhcol.com.br_

@ guido_nhcol.com.br_ Bir ekstra eklersiniz /, şöyle olmalıdır:$response = preg_replace('/[\x80-\xFF]/', '', $response);
H Aßdøµ

20

Kabuk erişimine sahip olanlar için, public_html dizininde BOM setine sahip tüm dosyaları bulmak için küçük bir komut var - bunu sunucunuzdaki doğru yolunuzla değiştirdiğinizden emin olun.

Kod:

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

ve vi düzenleyiciden memnunsanız , dosyayı vi'de açın:

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

Ve Malzeme Listesini kaldırmak için komutu girin:

set nobomb

Dosya 'yı kaydet:

wq

1
grep -rlI $'\xEF\xBB\xBF' .İkili dosyaları yok saymak için kullanın .
Nabi KAZ

11

BOM yalnızca bir karakter dizisidir (UTF-8 için $ EF $ BB $ BF), bu nedenle komut dosyalarını kullanarak bunları kaldırın veya editörü eklenmeyecek şekilde yapılandırın.

Gönderen UTF-8 den BOM Çıkarma :

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

PHP'ye kolayca çevrildiğinden eminim.


6
Malzeme Listesinin bir karakter dizisi olmadığını, tek bir karakter olduğunu unutmayın. Dosya UTF-8 ise, karakter üç bayt olarak temsil edilir . Dosya UTF-8 ise, onu başka bir kodlamada görüntülemek (yani, BOM'un olması gereken yerde EF BB BF'nin göründüğü bir kod) bir hatadır. BOM'u UTF-8 dosyasından kaldırmak için (tek) karakter U + FEFF kaldırılmalıdır. Evet, bilgiçlik!
Jeffrey L Whitledge

1
PHP'de çalışmayı başaramadım (bu sadece benim beceriksizliğim, senin değil: P), bu yüzden BOM'un orada olup olmadığını kontrol ettim ve ilk 3 karakteri kaldırdım. İhtiyaç varsa kod burada: if (substr ($ css, 0,3) == pack ("CCC", 0xef, 0xbb, 0xbf)) {$ css = substr ($ css, 3); }
Matt

7
php'ye çevirir $string = preg_replace('/\x{EF}\x{BB}\x{BF}/','',$string);. Bunu kullanmadan önce, sorunu kaynağında çözüp çözemeyeceğinizi yeniden düşünün.
commonpike

6

Benim için bu işe yaradı:

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

Bu metayı kaldırırsam, ï »¿yeniden belirir. Umarım bu birine yardımcı olur ...


5

PHP bilmiyorum, bu yüzden bunun mümkün olup olmadığını bilmiyorum, ancak en iyi çözüm dosyayı başka bir kodlama yerine UTF-8 olarak okumaktır. Ürün reçetesi aslında SIFIR GENİŞLİK KIRILMAZ ALANDIR. Bu boşluktur, bu nedenle dosya doğru kodlamayla (UTF-8) okunuyorsa, BOM beyaz boşluk olarak yorumlanacak ve elde edilen CSS dosyasında yok sayılacaktır.

Ayrıca, dosyayı doğru kodlamayla okumanın bir başka avantajı da, karakterlerin yanlış yorumlanması konusunda endişelenmenize gerek olmamasıdır. Editörünüz, onu kaydetmek istediğiniz kod sayfasının ihtiyacınız olan tüm karakterleri yapmayacağını söylüyor. PHP daha sonra dosyayı yanlış kodlamayla okuyorsa, büyük olasılıkla BOM dışındaki diğer karakterler sessizce yanlış yorumlanıyor. UTF-8'i her yerde kullanın ve bu sorunlar ortadan kalkar.


3

Kullanabilirsiniz

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

Awk ile değiştirmek işe yarıyor gibi görünüyor, ancak yerinde değil.


2

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


grep -rlI $'\xEF\xBB\xBF' .İkili dosyaları yok saymak için kullanın . Ve ayrıca buradan .daha iyi *.
Nabi KAZ

2

Bazı PHP dosyalarımda (ï »¿ï» ¿) BOM ile aynı sorunu yaşadım.

PhpStorm kullanıyorsanız , kısayol tuşunu Ayarlar -> IDE Ayarları -> Tuş Eşleme -> Ana Menü -> Dosya -> Malzeme Listesini Kaldır'da kaldırmak için ayarlayabilirsiniz.



2

Söz konusu PHP dosyasını Notepad ++ ile açın.

En üstteki Kodlama'yı tıklayın ve "BOM olmadan UTF-8'de Kodlama" yerine yalnızca "UTF-8'de Kodlama" olarak değiştirin. Sunucunuzdaki dosyayı kaydedin ve üzerine yazın.


1

Aynı problem, farklı çözüm.

PHP dosyasındaki bir satır, XML başlıklarını yazdırıyordu (PHP ile aynı başlangıç ​​/ bitiş etiketlerini kullanır). Görünüşe göre bu etiketlerdeki kod, kodlamayı ayarlıyor ve PHP içinde çalıştırılıyor ve bu da garip karakterlerle sonuçlanıyor. Her iki durumda da çözüm şudur:

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

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

1

BOM'u UTF-8 kodlu dosyalardan kaldırmanız gerekiyorsa, önce bunlardan haberdar olan bir düzenleyiciye sahip olmanız gerekir.

Ben şahsen E Metin Editörü kullanıyorum .

Sağ altta, BOM etiketi dahil olmak üzere karakter kodlama seçenekleri vardır. Dosyanızı yükleyin, seçilmişse Bayt Sırası İşaretleyicinin seçimini kaldırın, yeniden kaydedin ve yapılmalıdır.

Alternatif metin http://oth4.com/encoding.png

E ücretsiz değildir, ancak ücretsiz bir deneme sürümü vardır ve mükemmel bir düzenleyicidir (sınırlı TextMate uyumluluğu).


1
Resim bağlantısı koptu.
Peter Mortensen


1

İşte BOM ile ilgili sorun için başka bir iyi çözüm. Bunlar iki VBScript (.vbs) komut dosyasıdır.

Biri bir dosyada ürün reçetesini bulmak ve diğeri dosyadaki lanet olası malzeme listesini ÖLDÜRMEK için. Oldukça iyi çalışıyor ve kullanımı kolay.

Bir .vbs dosyası oluşturun ve aşağıdaki kodu içine yapıştırın.

VBScript komut dosyasını yalnızca şüpheli dosyayı .vbs dosyasına sürükleyip bırakarak kullanabilirsiniz. Size bir ürün reçetesi olup olmadığını söyleyecektir.

' 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

BOM olduğunu söylerse, gidin ve aşağıdaki kodla ikinci .vbs dosyasını oluşturun ve suspicios dosyasını .vbs dosyasına sürükleyin.

' 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

Kod Heiko Jendreck'ten .


1

PHPStorm'da, birden çok dosya ve BOM için dosyanın başlangıcında olması gerekmiyorsa, arama yapabilir \x{FEFF}(Normal İfade) ve hiçbir şey olmadan değiştirebilirsiniz.


0

Aynı sorun, ancak yalnızca bir dosyayı etkiledi, bu yüzden boş bir dosya oluşturdum, kodu orijinal dosyadan yeni dosyaya kopyalayıp / yapıştırdım ve ardından orijinal dosyayı değiştirdim. Fantezi değil ama işe yaradı.


0

Tüm BOMed dosyalarını aramak için Total Commander'ı kullanın :

BOM ile UTF-8 dosyalarını aramanın zarif yolu?

  • Bu dosyaları Eclipse gibi uygun bir düzenleyicide (Malzeme Listesini tanıyan) açın .

  • Dosyanın kodlamasını ISO olarak değiştirin (sağ tıklama, özellikler).

  • Dosyanın başından ï »¿kesin, kaydedin

  • Dosyanın kodlamasını tekrar UTF-8 olarak değiştirin

... ve n ... d'yi tekrar kullanmayı düşünmeyin bile!


0

Ben de aynı sorunu yaşadım. Sorun, php dosyalarımdan birinin utf-8'de olmasıydı (en önemlisi, tüm php dosyalarında bulunan yapılandırma dosyası).

Benim durumumda, benim için çalışan 2 farklı çözümüm vardı:

Öncelikle, yapılandırma dosyalarında (veya .htaccess'te) AddDefaultCharsetDirective kullanarak Apache Yapılandırmasını değiştirdim. Bu çözüm Apache'yi doğru kodlamayı kullanmaya zorlar.

AddDefaultCharset ISO-8859-1

İkinci çözüm, php dosyasının kötü kodlamasını değiştirmekti.


0
  1. Dosyaadı.css dosyanızın metnini kopyalayın.
  2. Css dosyanızı kapatın.
  3. Dosya adı çakışmasını önlemek için dosyaadı2.css olarak yeniden adlandırın.
  4. MS Not Defteri veya Wordpad'de yeni bir dosya oluşturun.
  5. Metni içine yapıştırın.
  6. Kodlama seçeneklerinden UTF-8'i seçerek dosyaadı.css olarak kaydedin.
  7. Dosyaadı.css dosyasını yükleyin.

0

Bu benim için çalışıyor!

def removeBOMs(fileName):
     BOMs = ['',#Bytes as CP1252 characters
    'þÿ',
    'ÿþ',
    '^@^@þÿ',
    'ÿþ^@^@',
    '+/v',
    '÷dL',
    'Ýsfs',
    'Ýsfs',
    '^Nþÿ',
    'ûî(',
    '„1•3']
     inputFile = open(fileName, 'r')
     contents = inputFile.read()
     for BOM in BOMs:
         if not BOM in contents:#no BOM in the file...
             pass
         else:
             newContents = contents.replace(BOM,'', 1)
             newFile = open(fileName, 'w')
             newFile.write(newContents)
             return None

-3

Kontrol edin index.php, "... charset=iso-8859-1" bulun ve yerine "... "charset=utf-8 .

Belki işe yarar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.