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.