Dosyalarda <0xEF, 0xBB, 0xBF> karakteri görünüyor. Onları nasıl kaldırabilirim?


87

JavaScript dosyalarını sıkıştırıyorum ve sıkıştırıcı dosyalarımın içinde karakter olduğundan şikayet ediyor .

Bu karakterleri nasıl arayabilir ve kaldırabilirim?


16
Yani değil <U+FEFF>yani, <0xEF,0xBB,0xBF>sen başlığını değiştirmek gerekir, böylece bu UTF8 dosyalarının BOM olduğunu. Bunları nasıl çıkarmak istersiniz? Sihirli periler tarafından mı? Komut satırı aracıyla mı? Tek tek düzenleyerek mi? Notepad ++, BOM olmadan kodlamayı UTF8 olarak değiştirebilir. Örneğin, 5 saniyelik "şerit BOM utf8" i Google'da araştırıyorum Bunu
xanatos

1
Sıkıştırmayı yapmak için hangi javascript aracını kullandığınızı, hangi platformda kullandığınızı ve diğer hangi araçların oluşturma sürecinizin bir parçası olduğunu bize söylerseniz, özellikle sorununuzla ilgili bir yanıt almanıza yardımcı olabilir.
SingleNegationElimination

15
UTF-8'deki BOM'lar mutlak zırvadır. Bu dosyanın yapımcısını bulmanız ve onu @ # %% kesmelerini söylemeniz gerekir.
tchrist

4
@peterflynn: U+FEFFbir BOM için kullanılan Unicode kod noktasıdır, ancak BOM'un kendisi bu kod noktasının nasıl kodlandığıdır (UTF-8:, 0xEF 0xBB 0xBFUTF-16LE:, 0xFF 0xFEUTF-16BE:, 0xFE 0xFFvb.). Dolayısıyla, söz konusu dosyalar UTF-8 kodludur ve sıkıştırıcı bunları gerçek Unicode kod noktalarına dönüştürürken algılamaktadır.
Remy Lebeau

4
@xanatos Ne olursa olsun, bu şekilde ortaya çıkıyor ve insanlar bu soruyu arama motorlarını kullanarak kolayca bulabilirler.
BartoszKP

Yanıtlar:


18
perl -pi~ -CSD -e 's/^\x{fffe}//' file1.js path/to/file2.js

Dosyalarınızda başka utf-8 varsa aracın bozulacağını varsayabilirim, ancak yoksa bu geçici çözüm size yardımcı olabilir. (Test edilmemiş ...)

Düzenle : -CSDseçenek, tchrist'in yorumuna göre eklendi.


1
Bunun çalışması için -CSDanahtarla veya PERL_UNICODEkısaltılabilir olarak ayarlanmış olarak çalıştırmanız gerekir SD.
tchrist

Normal ifade, bir satırın başındaki <fffe> karakterini kaldırmak için sorunsuz çalışır, bir satırdaki tüm <fffe> karakterlerini değiştirmek için: 's / \ x {fffe} // g'.
Diego Pino

2
Mac OSX'te perl -CSD -pe 's/^\x{feff}//' file.csvşuna geçmek zorunda kaldım :, <fffe> ile <feff> arasındaki değişikliği not edin.
mpettis

1
@mpettis Bu bir ürün reçetesi değil, baytları ters çevrilmiş bir malzeme listesi. UTF-16'yı UTF-8'e dönüştürürseniz ve bayt sırasını yanlış
alırsanız

1
@blong Buna ne dersiniz?
Çözemezseniz

188

Bunları vim kullanarak kolayca kaldırabilirsiniz , işte adımlar:

1) Terminalinizde vim kullanarak dosyayı açın:

vim file_name

2) Tüm BOM karakterlerini kaldırın :

:set nobomb

3) Dosyayı kaydedin:

:wq

Bu çözüm benim için çalıştı. Seçilen cevaptan daha basittir. Teşekkürler
szydan

Normalde emacs partizanı olmama rağmen bu harika çözümü kullandım. vim ftw
Ellen Spertus

31

Bu karakterleri kaldırmak için başka bir yöntem - Vim kullanarak :

vim -b dosyaAdı

Artık bu "gizli" karakterler görünür ( <feff>) ve kaldırılabilir.


20

Önceki cevaplar için teşekkürler, işte her ihtimale karşı bir sed (1) varyantı:

sed '1s/^\xEF\xBB\xBF//'

1
Diğer kaynaklar, yalnızca ilk satırla eşleşecek şekilde, "sed '1 s / \ xEF \ xBB \ xBF //"' deki gibi, şekil 1'in kalıbın başına eklenmesini önerir. Ancak, Mac OS X'te benim için hiçbir şekilde işe yaramıyor.
Marian

1
Bu işe yaradı ve benim için en iyi çözümdü. Teşekkürler bayım!
Vance Lucas

1
Bu çözümü sevdim. Uygulaması en kolay ve hala ölçeklenebilir ... :)
Piko

1
@Marian Biraz geç, ancak Masum'un neden Mac'te çalışmadığını gösteren cevabına bakabilirsiniz .
Birisi hala sizi MS-DOS kullanıyor

1
Dosyaları değişikliklerle güncellemek için sed'e -i ekleyin.
Johan

17

Unix / Linux'ta:

sed 's/\xEF\xBB\xBF//' < inputfile > outputfile

MacOSX'te

sed $'s/\xEF\xBB\xBF//' < inputfile > outputfile

Mac için sed'den sonra $ 'a dikkat edin.

Windows'ta

Sed'in geliştirilmiş bir versiyonu Super Sed var . Windows için bu, komut satırından çalıştırılması amaçlanan bağımsız bir .exe'dir.


1
"Mac için sed'den sonra $ 'a dikkat edin." - Teşekkürler bayım!
Birisi hala sizi MS-DOS kullanıyor

1
Bash "C-stili" dizesi $'\xEF\xBB\xBF//'bir Bash özelliğidir, özellikle bir Mac veya OSX özelliği değildir. Bu yapıyla Bash, komut satırını 'a geçmeden önce kaçış dizilerini gerçek baytlara ayrıştıracaktır sed. sedVaryantınıza bağlı olarak , bu işe yarayabilir veya çalışmayabilir (yine de OSX kullanıcılarının kendileri için kutudan çıkması gerektiğini bilmelerinin yararlı olduğuna eminim).
üçlü

1
belki sed -i 's /.../.../'
Arthur

6

Kuyruk kullanmak daha kolay olabilir:

tail --bytes=+4 filename > new_filename

1
Dosyanın üreticisi ürün reçetesini kaldırdıktan sonra bu teknik başarısız olur. Ölçeklenebilir değil ... :)
Piko

4

@ tripleee'nin çözümü benim için işe yaramadı. Ancak dosya kodlamasını ASCII ve tekrar UTF-8 olarak değiştirmek hile yaptı :-)


3

Bunun için vimgrep kullandım

:vim "[\uFEFF]" *

ayrıca normal vim arama komutu

/[\uFEFF]

2

'Dosya' komutu, BOM'un mevcut olup olmadığını gösterir:

Örneğin: 'dosya myfile.xml' şunu görüntüler: "XML 1.0 belgesi, UTF-8 Unicode (BOM ile) metin, çok uzun satırlar, CRLF satır sonlandırıcılar ile"

dos2unix, BOM'u kaldıracaktır.



1

In Sublime Text yükleyebilirsiniz İşaretleyici paketi ve ardından kullanıcı ayarlarında normal ifade özelleştirin.

Burada mülkün \uFEFFsonuna ekledim highlighter_regex.

{
    "highlighter_enabled": true,
    "highlighter_regex": "(\t+ +)|( +\t+)|[\u2026\u2018\u2019\u201c\u201d\u2013\u2014\uFEFF]|[\t ]+$",
    "highlighter_scope_name": "invalid",
    "highlighter_max_file_size": 1048576,
    "highlighter_delay": 3000
}

Varsayılan paket ayarlarının üzerine yazmak için dosyayı buraya yerleştirin:

~ / .config / sublime-text-3 / Packages / User / highlighter.sublime-settings


1

"Dos2unix" aracının kullanılmasını öneriyorum, lütfen çalıştırmak için test edin dos2unix ./thefile.js.

Gerekirse birden çok dosya için şuna benzer bir şey kullanmayı deneyin:

for x in $(find . -type f -exec echo {} +); do dos2unix $x ; done

Saygılarımla.


1
Cevabınızı beğendimbomstripfind . -type f -exec dos2unix '{}' +
Mac'imde

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.