Przetwórz plik zaczynający się od BOM (FF FE)

10

Otrzymałem plik .csv z FF FEBOM:

$ head -n1 dotan.csv | hd
00000000  ff fe 41 00 64 00 20 00  67 00 72 00 6f 00 75 00  |..A.d. .g.r.o.u.|

Podczas awkanalizowania otrzymuję wiązkę zerowych bajtów, co, jak podejrzewam, wynika z kolejności bajtów. Jak mogę zamienić kolejność bajtów w tym pliku (za pomocą CLI), aby normalne narzędzia z nim działały?

Zauważ, że myślę, że ten plik to tylko znaki ASCII (oprócz BOM), ale nie mogę tego potwierdzić, ponieważ uważam grep, że jest to plik binarny:

$ grep -P '^[\x00-\x7f]' dotan.csv 
Binary file dotan.csv matches

Wyszukiwanie tego samego ciągu w VIM pokazuje dopasowanie każdego znaku !

Użycie iconvkonwersji do ASCII nie pozbywa się wartości \ x00, w rzeczywistości pogarsza problem, ponieważ teraz wyglądają jak bajty zerowe zamiast UTF-8!

$ iconv -f UTF-8 -t ASCII dotan.csv > fixed.txt 
iconv: illegal input sequence at position 0

$ iconv -f UTF-8 -t ASCII//IGNORE dotan.csv > fixed.txt

$ head -n1 fixed.txt | hd
00000000  41 00 64 00 20 00 67 00  72 00 6f 00 75 00 70 00  |A.d. .g.r.o.u.p.|

Jak mogę zamienić kolejność bajtów w tym pliku (za pomocą CLI), aby normalne narzędzia z nim działały?

dotancohen
źródło
Plik CSV utworzony w systemie Windows lub Mac?
cuonglm
Czy możesz podać część pliku?
cuonglm
Oto link do anonimowej części pliku, która zachowuje unikalne problemy z nim. Dziękuję Ci!
dotancohen

Odpowiedzi:

16

Z tego wikipedia artykule , FF FEoznacza UTF16LE. Powinieneś więc powiedzieć, iconvaby przekonwertować z UTF16LEna UTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
Cuonglm
źródło
Perfekcyjnie, dziękuję! Zmieszałem BOM UTF-8 i UTF-16: Myślałem, że FFFE i FEFF to UTF-8 i nigdy nie znałem BOM (ów) UTF-16. W rzeczywistości są to LM UTF-16 i nigdy nie znałem (bezużytecznego) LM UTF-8 !.
dotancohen
@dotancohen: Testuję w mojej Fedorze i tailrozwiązanie działa dobrze. Z jakiego systemu operacyjnego korzystasz?
cuonglm
To nie działa (tzn. Usuwa BOM) dla wersji „iconv (GNU libiconv 1.14)” w Git Bash w systemie Windows. Ale (z jakiegokolwiek powodu) użycie tylko UTF-16zamiast jednej wersji kolejności bajtów działa.
Kenny Evitt
3

dos2unix usuwa również LM i konwertuje UTF-16 na UTF-8:

$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a
feff3042
dos2unix: converting file a to Unix format...
e38182

dos2unix usuwa również LM UTF-8:

$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61
nisetama
źródło
0

Odpowiedział także na StackOverflow: Jak mogę usunąć BOM z pliku UTF-8? @rici ma dobrą odpowiedź.

Krótka odpowiedź:

  • Krótka odpowiedź: sed -i $'1s/^\uFEFF//' file.txtale nie dotyczy BSD ani OS / X.
  • Inna odpowiedź: vi file.txt, :set nobomb, :w, proste, ale instrukcja
  • Zainstaluj dos2unuix; dos2unix -r file.txt
  • Te znaki mają kilka możliwych znaczeń, w tym tylko to, że plik to UTF-8; zobacz artykuł w Wikipedii .
  • Programy Windows uwielbiają dodawać te znaki. Większość redaktorów nie usuwa tych znaków.
Charles Merriam
źródło