Czym różni się UTF-8 i UTF-8 bez BOM ? Który jest lepszy?
Czym różni się UTF-8 i UTF-8 bez BOM ? Który jest lepszy?
Odpowiedzi:
LM UTF-8 to sekwencja bajtów na początku strumienia tekstowego ( 0xEF, 0xBB, 0xBF
), która pozwala czytelnikowi na bardziej wiarygodne odgadnięcie pliku zakodowanego w UTF-8.
Zwykle BOM jest używany do sygnalizowania endianowości kodowania, ale ponieważ endianowość nie ma znaczenia dla UTF-8, BOM jest niepotrzebny.
Według standardu Unicode , BOM plików UTF-8 nie jest zalecane :
2.6 Schematy kodowania
... Użycie BOM nie jest wymagane ani zalecane dla UTF-8, ale może wystąpić w kontekstach, w których dane UTF-8 są konwertowane z innych form kodowania, które używają BOM lub gdzie BOM jest używany jako podpis UTF-8 . Aby uzyskać więcej informacji, zobacz podsekcję „Bajtowy znak porządkowy” w rozdziale 16.8, Specjalne .
Inne doskonałe odpowiedzi już odpowiedziały, że:
EF BB BF
Ale jako dodatkowa informacja do tego, BOM dla UTF-8 może być dobrym sposobem na „wąchanie”, jeśli łańcuch został zakodowany w UTF-8 ... Lub może być prawidłowym łańcuchem w dowolnym innym kodowaniu ...
Na przykład dane [EF BB BF 41 42 43] mogą być albo:
Więc chociaż fajnie jest rozpoznać kodowanie zawartości pliku, patrząc na pierwsze bajty, nie powinieneś na tym polegać, jak pokazano w powyższym przykładzie
Kodowanie powinno być znane, a nie boskie.
Istnieją co najmniej trzy problemy z umieszczeniem BOM w plikach zakodowanych w UTF-8.
I, jak wspomnieli inni, posiadanie BOM nie jest wystarczające ani konieczne do wykrycia, że coś jest UTF-8:
cat
nie da ci czystego wyniku, który ma BOM dopiero na starcie. Jeśli miałeś to na myśli, to dlatego, że cat
działa na poziomie bajtów, a nie na poziomie interpretowanej zawartości, i w podobny sposób cat
nie może poradzić sobie ze zdjęciami, powiedzmy. Nadal nie wyrządza to wiele szkody. Wynika to z faktu, że zestawienie komponentów koduje nieprzerwaną przestrzeń o zerowej szerokości.
Oto przykłady użycia BOM, które faktycznie powodują prawdziwe problemy, a jednak wiele osób nie wie o tym.
Skrypty powłoki, skrypty Perla, skrypty Python, skrypty Ruby, skrypty Node.js lub inne pliki wykonywalne, które muszą być uruchamiane przez interpreter - wszystko zaczyna się od linii shebang, która wygląda jak jedna z tych:
#!/bin/sh
#!/usr/bin/python
#!/usr/local/bin/perl
#!/usr/bin/env node
Informuje system, który interpreter musi zostać uruchomiony podczas wywoływania takiego skryptu. Jeśli skrypt jest zakodowany w UTF-8, można pokusić się o dołączenie BOM na początku. Ale tak naprawdę „#!” znaki to nie tylko znaki. W rzeczywistości są magiczną liczbą, która składa się z dwóch znaków ASCII. Jeśli umieścisz coś (np. LM) przed tymi znakami, plik będzie wyglądał, jakby miał inną magiczną liczbę i może to prowadzić do problemów.
Patrz Wikipedia, artykuł: Shebang, sekcja: Magiczny numer :
Znaki shebang są reprezentowane przez te same dwa bajty w rozszerzonych kodowaniach ASCII, w tym UTF-8, który jest powszechnie używany w skryptach i innych plikach tekstowych w obecnych systemach uniksopodobnych. Pliki UTF-8 mogą jednak zaczynać się od opcjonalnego znaku kolejności bajtów (BOM); jeśli funkcja „exec” konkretnie wykrywa bajty 0x23 i 0x21, to obecność BOM (0xEF 0xBB 0xBF) przed shebang uniemożliwi wykonanie interpretera skryptu.Niektóre organy odradzają stosowanie znaku kolejności bajtów w skryptach POSIX (uniksopodobnych) [14] z tego powodu oraz ze względu na szerszą interoperacyjność i obawy filozoficzne. Ponadto znak kolejności bajtów nie jest konieczny w UTF-8, ponieważ kodowanie to nie ma problemów z endianowością; służy jedynie do identyfikacji kodowania jako UTF-8. [podkreślenie dodane]
Patrz RFC 7159, sekcja 8.1 :
Implementacje NIE MUSZĄ dodawać znaku kolejności bajtów na początku tekstu JSON.
Jest to nie tylko nielegalne w JSON, ale także nie jest potrzebne do określania kodowania znaków, ponieważ istnieją bardziej niezawodne sposoby jednoznacznego określenia zarówno kodowania znaków, jak i endianizmu używanych w dowolnym strumieniu JSON (szczegóły w tej odpowiedzi ).
Jest nie tylko nielegalne w JSON i niepotrzebne , ale w rzeczywistości psuje całe oprogramowanie, które określa kodowanie przy użyciu metody przedstawionej w RFC 4627 :
Określanie kodowania i endianizmu JSON, badanie pierwszych czterech bajtów dla bajtu NUL:
00 00 00 xx - UTF-32BE
00 xx 00 xx - UTF-16BE
xx 00 00 00 - UTF-32LE
xx 00 xx 00 - UTF-16LE
xx xx xx xx - UTF-8
Teraz, jeśli plik zaczyna się od BOM, będzie wyglądał następująco:
00 00 FE FF - UTF-32BE
FE FF 00 xx - UTF-16BE
FF FE 00 00 - UTF-32LE
FF FE xx 00 - UTF-16LE
EF BB BF xx - UTF-8
Uwaga:
W zależności od implementacji wszystkie z nich mogą być interpretowane niepoprawnie jako UTF-8, a następnie błędnie interpretowane lub odrzucane jako nieprawidłowe UTF-8 lub w ogóle nie rozpoznawane.
Dodatkowo, jeśli implementacja przetestuje poprawny JSON zgodnie z zaleceniem, odrzuci nawet dane wejściowe, które rzeczywiście są zakodowane jako UTF-8, ponieważ nie zaczynają się one od znaku ASCII <128, jak powinny zgodnie z RFC.
BOM w JSON nie jest potrzebny, jest nielegalny i psuje oprogramowanie, które działa poprawnie zgodnie z RFC. Nobrainer powinien po prostu nie używać go wtedy, a jednak zawsze są ludzie, którzy nalegają na złamanie JSON za pomocą BOM, komentarzy, różnych reguł cytowania lub różnych typów danych. Oczywiście każdy może używać takich rzeczy jak BOM lub cokolwiek innego, jeśli potrzebujesz - po prostu nie nazywaj tego JSON.
W przypadku formatów danych innych niż JSON zobacz, jak to naprawdę wygląda. Jeśli jedynym kodowaniem jest UTF- *, a pierwszy znak musi być znakiem ASCII niższym niż 128, oznacza to, że masz już wszystkie informacje potrzebne do określenia zarówno kodowania, jak i endianiczności danych. Dodanie zestawień komponentów nawet jako funkcji opcjonalnej sprawiłoby, że byłoby to bardziej skomplikowane i podatne na błędy.
Jeśli chodzi o zastosowania poza JSON lub skryptami, myślę, że są już tutaj bardzo dobre odpowiedzi. Chciałem dodać bardziej szczegółowe informacje dotyczące skryptów i serializacji, ponieważ jest to przykład znaków BOM powodujących poważne problemy.
Czym różni się UTF-8 i UTF-8 bez BOM?
Krótka odpowiedź: w UTF-8 BOM jest kodowany jako bajty EF BB BF
na początku pliku.
Długa odpowiedź:
Początkowo oczekiwano, że Unicode będzie kodowany w UTF-16 / UCS-2. BOM został zaprojektowany dla tej formy kodowania. Jeśli masz 2-bajtowe jednostki kodu, musisz wskazać, w jakiej kolejności znajdują się te dwa bajty, a powszechną konwencją do tego jest dołączanie znaku U + FEFF jako „Bajtowego znaku porządkowego” na początku danych. Znak U + FFFE jest trwale nieprzypisany, więc jego obecność może zostać użyta do wykrycia niewłaściwej kolejności bajtów.
UTF-8 ma tę samą kolejność bajtów niezależnie od endianizmu platformy, więc znak kolejności bajtów nie jest potrzebny. Może jednak wystąpić (jako sekwencja bajtów EF BB FF
) w danych przekonwertowanych na UTF-8 z UTF-16 lub jako „sygnatura” wskazująca, że dane to UTF-8.
Który jest lepszy?
Bez. Jak odpowiedział Martin Cote, standard Unicode tego nie zaleca. Powoduje to problemy z oprogramowaniem nieobsługującym BOM.
Lepszym sposobem na wykrycie, czy plik to UTF-8, jest sprawdzenie poprawności. UTF-8 ma ścisłe reguły dotyczące tego, jakie sekwencje bajtów są poprawne, więc prawdopodobieństwo fałszywie dodatniego wyniku jest znikome. Jeśli sekwencja bajtów wygląda jak UTF-8, prawdopodobnie tak jest.
sh
, perl
, g++
oraz wiele innych wolnych i potężnych narzędzi. Chcesz, żeby coś działało? Wystarczy kupić wersje MS. MS stworzyło problem związany z platformą, podobnie jak katastrofa w swoim zakresie \ x80- \ x95.
UTF-8 z BOM jest lepiej identyfikowany. Doszedłem do tego wniosku na własnej skórze. Pracuję nad projektem, w którym jednym z wyników jest plik CSV zawierający znaki Unicode.
Jeśli plik CSV zostanie zapisany bez BOM, Excel uważa, że jest to ANSI i pokazuje bełkot. Po dodaniu „EF BB BF” z przodu (na przykład poprzez ponowne zapisanie go za pomocą Notatnika z UTF-8; lub Notepad ++ z UTF-8 z BOM), Excel otwiera go dobrze.
Przygotowanie znaku BOM do plików tekstowych Unicode jest zalecane przez RFC 3629: „UTF-8, format transformacji ISO 10646”, listopad 2003 na stronie http://tools.ietf.org/html/rfc3629 (ta ostatnia informacja znajduje się na: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html )
BOM ma tendencję do boomu (nie ma sensu (sic)) gdzieś, gdzieś. A kiedy hukuje (na przykład nie jest rozpoznawany przez przeglądarki, edytory itp.), Pojawia się jako dziwne znaki 
na początku dokumentu (na przykład plik HTML, odpowiedź JSON , RSS itp.) i powoduje rodzaj zawstydzeń, takich jak niedawny problem z kodowaniem, który wystąpił podczas rozmowy Obamy na Twitterze .
To bardzo denerwujące, gdy pojawia się w miejscach trudnych do debugowania lub gdy testy są zaniedbywane. Dlatego najlepiej go unikać, chyba że musisz go użyć.
Pytanie: Czym różni się UTF-8 i UTF-8 bez BOM? Który jest lepszy?
Oto kilka fragmentów artykułu z Wikipedii na temat znaku kolejności bajtów (BOM), który moim zdaniem stanowi solidną odpowiedź na to pytanie.
Znaczenie BOM i UTF-8:
Standard Unicode zezwala na BOM w UTF-8 , ale nie wymaga ani nie zaleca jego używania. Kolejność bajtów nie ma znaczenia w UTF-8, więc jego jedynym zastosowaniem w UTF-8 jest zasygnalizowanie na początku, że strumień tekstowy jest kodowany w UTF-8.
Argument NIE używający BOM:
Podstawową motywacją do nieużywania BOM jest zgodność wsteczna z oprogramowaniem, które nie obsługuje Unicode ... Kolejną motywacją do nieużywania BOM jest zachęcenie UTF-8 jako „domyślnego” kodowania.
Argument ZA użyciem BOM:
Argumentem za użyciem BOM jest to, że bez niego konieczna jest analiza heurystyczna w celu ustalenia, jakiego znaku koduje plik. Historycznie taka analiza w celu rozróżnienia różnych kodowań 8-bitowych jest skomplikowana, podatna na błędy, a czasem powolna. Dostępnych jest wiele bibliotek ułatwiających zadanie, takich jak Mozilla Universal Charset Detector i International Components for Unicode.
Programiści błędnie zakładają, że wykrycie UTF-8 jest równie trudne (nie dzieje się tak, ponieważ znaczna większość sekwencji bajtów jest niepoprawna UTF-8, podczas gdy kodowania w tych bibliotekach próbują odróżnić wszystkie możliwe sekwencje bajtów). Dlatego nie wszystkie programy obsługujące Unicode przeprowadzają taką analizę i zamiast tego polegają na BOM.
W szczególności kompilatory i interpretatory Microsoft oraz wiele programów w systemie Microsoft Windows, takich jak Notatnik, nie będą poprawnie odczytywać tekstu UTF-8, chyba że będą miały tylko znaki ASCII lub zaczną się od BOM i dodają BOM na początku podczas zapisywania tekst jako UTF-8. Dokumenty Google dodają BOM, gdy dokument Microsoft Word zostanie pobrany jako zwykły plik tekstowy.
Na czym jest lepiej, Z lub BEZ BOM:
IETF zaleca jeśli protokół (a) zawsze używa UTF-8, lub (b) ma w jakiś inny sposób, aby wskazać kodowanie jest wykorzystywany, to powinna ona „zabronić korzystania z U + FEFF jako sygnatura.”
Mój wniosek:
Korzystaj z BOM tylko wtedy, gdy absolutnie niezbędna jest zgodność z aplikacją.
Zwróć też uwagę, że chociaż przywoływany artykuł z Wikipedii wskazuje, że wiele aplikacji Microsoft polega na BOM w celu prawidłowego wykrycia UTF-8, nie dotyczy to wszystkich aplikacji Microsoft. Na przykład, jak wskazał @barlop , podczas korzystania z wiersza polecenia systemu Windows z UTF-8 † , takie polecenia type
i more
nie oczekują obecności BOM. Jeśli zestawienie komponentów jest obecne, może być problematyczne, podobnie jak w przypadku innych aplikacji.
† chcp
Komenda oferuje obsługę UTF-8 ( bez BOM) za pośrednictwem strony kodowej 65001 .
.htaccess
i gzip compression
w połączeniu z UTF-8 BOM daje błąd kodowania Change do kodowania UTF-8 bez BOM obserwacji do sugestii, jak wyjaśniono tutaj rozwiązać problemy
To pytanie ma już milion odpowiedzi i wiele z nich jest całkiem dobrych, ale chciałem spróbować wyjaśnić, kiedy należy użyć BOM.
Jak wspomniano, jakiekolwiek użycie BOM UTF (Byte Order Mark) w celu ustalenia, czy ciąg znaków jest UTF-8, czy nie, jest wykształconym zgadywaniem. Jeśli dostępne są odpowiednie metadane (np. charset="utf-8"
), To już wiesz, czego powinieneś używać, ale w przeciwnym razie musisz przetestować i przyjąć pewne założenia. Obejmuje to sprawdzenie, czy plik, z którego pochodzi łańcuch, zaczyna się od szesnastkowego kodu bajtowego EF BB BF.
Jeśli zostanie znaleziony kod bajtu odpowiadający BOM UTF-8, prawdopodobieństwo jest wystarczająco wysokie, aby założyć, że jest to UTF-8 i można stąd przejść. Gdy jednak zmuszony jest zgadnąć, dodatkowe sprawdzanie błędów podczas czytania nadal byłoby dobrym pomysłem na wypadek, gdyby coś się zniekształciło. Powinieneś założyć, że BOM nie jest UTF-8 (tj. Latin-1 lub ANSI), jeśli dane wejściowe zdecydowanie nie powinny być UTF-8 na podstawie jego źródła. Jeśli jednak nie ma BOM, możesz po prostu ustalić, czy ma to być UTF-8, sprawdzając poprawność względem kodowania.
Jeśli nie możesz zarejestrować metadanych w żaden inny sposób (za pomocą znacznika charset lub meta systemu plików), a programy używane są jak BOM, powinieneś zakodować BOM. Jest to szczególnie prawdziwe w systemie Windows, w którym zakłada się, że wszystko bez BOM używa starszej strony kodowej. BOM informuje programy takie jak Office, że tak, tekst w tym pliku to Unicode; oto zastosowane kodowanie.
Jeśli chodzi o to, jedynymi plikami, z którymi naprawdę mam problemy, są CSV. W zależności od programu albo musi albo nie musi mieć BOM. Na przykład, jeśli używasz programu Excel 2007+ w systemie Windows, musisz go zakodować przy użyciu BOM, jeśli chcesz go płynnie otworzyć i nie musisz uciekać się do importowania danych.
Należy zauważyć, że w przypadku niektórych plików BOM nie może mieć nawet w systemie Windows. Przykładami są SQL*plus
lub VBScript
pliki. W przypadku, gdy takie pliki zawierają zestawienie komponentów, podczas próby ich wykonania pojawia się błąd.
UTF-8 z BOM pomaga tylko wtedy, gdy plik faktycznie zawiera niektóre znaki spoza ASCII. Jeśli jest dołączony i nie ma żadnych, prawdopodobnie spowoduje to uszkodzenie starszych aplikacji, które inaczej interpretowałyby plik jako zwykły ASCII. Te aplikacje na pewno zawiodą, gdy napotkają znak spoza ASCII, więc moim zdaniem BOM powinien zostać dodany tylko wtedy, gdy plik może i nie powinien być już interpretowany jako zwykły ASCII.
Chcę wyjaśnić, że wolę w ogóle nie mieć BOM. Dodaj go, jeśli niektóre stare śmieci zepsują się bez niego, a zastąpienie tej starszej aplikacji nie jest możliwe.
Nie każ niczego oczekiwać BOM dla UTF-8.
Cytat na dole strony Wikipedii na BOM: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2
„Użycie BOM nie jest ani wymagane ani zalecane dla UTF-8, ale może wystąpić w kontekstach, w których dane UTF-8 są konwertowane z innych form kodowania, które używają BOM lub gdzie BOM jest używany jako podpis UTF-8”
UTF-8 bez BOM nie ma BOM, co nie czyni go lepszym niż UTF-8 z BOM, z wyjątkiem sytuacji, gdy konsument pliku musi wiedzieć (lub chciałby wiedzieć), czy plik jest zakodowany w UTF-8 albo nie.
BOM jest zwykle przydatny do określenia endianowości kodowania, co nie jest wymagane w większości przypadków użycia.
Ponadto zestawienie komponentów może być niepotrzebnym hałasem / bólem dla tych konsumentów, którzy go nie znają lub nie dbają o niego, i może powodować dezorientację użytkowników.
Patrzę na to z innej perspektywy. Myślę, że UTF-8 z BOM jest lepszy, ponieważ dostarcza więcej informacji o pliku. Używam UTF-8 bez BOM tylko wtedy, gdy mam problemy.
Używam wielu języków (nawet cyrylicy ) na moich stronach przez długi czas, a kiedy pliki są zapisywane bez BOM i ponownie otwieram je do edycji w edytorze (jak zauważyli również cherouvim ), niektóre znaki są uszkodzone.
Zwróć uwagę, że klasyczny Notatnik systemu Windows automatycznie zapisuje pliki z BOM, gdy próbujesz zapisać nowo utworzony plik z kodowaniem UTF-8.
Osobiście zapisuję pliki skryptów po stronie serwera (.asp, .ini, .aspx) z plikami BOM i .html bez BOM .
chcp 65001
obsługi utf8, to utf8 bez bom. Jeśli to zrobisz type myfile
, wyświetli się poprawnie tylko wtedy, gdy nie ma BOM. Jeśli zrobisz echo aaa>a.a
lub echo אאא>a.a
wyślesz znaki do pliku aa, a chcesz chcieć 65001, wyśle to bez BOM.
Gdy chcesz wyświetlić informacje zakodowane w UTF-8, możesz nie mieć problemów. Zadeklaruj na przykład dokument HTML jako UTF-8, a wszystko w przeglądarce będzie wyświetlane w treści dokumentu.
Nie dzieje się tak jednak w przypadku plików tekstowych, CSV i XML, zarówno w systemie Windows, jak i Linux.
Na przykład plik tekstowy w systemie Windows lub Linux, jedna z najłatwiejszych rzeczy, jakie można sobie wyobrazić, nie jest to (zwykle) UTF-8.
Zapisz go jako XML i zadeklaruj jako UTF-8:
<?xml version="1.0" encoding="UTF-8"?>
Nie wyświetli się (nie zostanie odczytany) poprawnie, nawet jeśli zostanie zadeklarowany jako UTF-8.
Miałem ciąg danych zawierający francuskie litery, które należało zapisać jako XML do syndykacji. Bez tworzenia pliku UTF-8 od samego początku (zmiana opcji w IDE i „Utwórz nowy plik”) lub dodawanie BOM na początku pliku
$file="\xEF\xBB\xBF".$string;
Nie byłem w stanie zapisać francuskich liter w pliku XML.
Jedną praktyczną różnicą jest to, że jeśli napiszesz skrypt powłoki dla Mac OS X i zapiszesz go jako zwykły UTF-8, otrzymasz odpowiedź:
#!/bin/bash: No such file or directory
w odpowiedzi na linię shebang określającą, której powłoki chcesz użyć:
#!/bin/bash
Jeśli zapiszesz jako UTF-8, brak BOM (powiedzmy w BBEdit ) wszystko będzie dobrze.
Jak wspomniano powyżej, UTF-8 z BOM może powodować problemy z oprogramowaniem nieobsługującym BOM (lub zgodnym). Kiedyś edytowałem pliki HTML zakodowane jako UTF-8 + BOM w opartym na Mozilli KompoZer , ponieważ klient wymagał programu WYSIWYG .
Niezmiennie układ zostanie zniszczony podczas zapisywania. Zajęło mi trochę czasu, żeby się tym zająć. Pliki te następnie działały dobrze w Firefoksie, ale pokazały dziwactwo CSS w Internet Explorerze, niszcząc układ. Po wielu godzinach majstrowania przy połączonych plikach CSS okazało się, że Internet Explorer nie lubił pliku HTML BOMfed. Nigdy więcej.
Właśnie znalazłem to w Wikipedii:
Znaki shebang są reprezentowane przez te same dwa bajty w rozszerzonych kodowaniach ASCII, w tym UTF-8, który jest powszechnie używany w skryptach i innych plikach tekstowych w obecnych systemach uniksopodobnych. Pliki UTF-8 mogą jednak zaczynać się od opcjonalnego znaku kolejności bajtów (BOM); jeśli funkcja „exec” konkretnie wykrywa bajty 0x23 0x21, to obecność BOM (0xEF 0xBB 0xBF) przed shebang uniemożliwi wykonanie interpretera skryptu. Niektóre organy odradzają stosowanie znaku kolejności bajtów w skryptach POSIX (uniksopodobnych) [15] z tego powodu oraz ze względu na szerszą interoperacyjność i obawy filozoficzne
FAQ Unicode Byte Order Mark (BOM) zawiera zwięzłą odpowiedź:
P: Jak powinienem postępować z BOM?
Odp .: Oto kilka wskazówek, których należy przestrzegać:
Określony protokół (np. Konwencje Microsoft dla plików .txt) może wymagać użycia BOM w niektórych strumieniach danych Unicode, takich jak pliki. Jeśli musisz dostosować się do takiego protokołu, użyj BOM.
Niektóre protokoły zezwalają na opcjonalne LM w przypadku nieoznaczonego tekstu. W takich przypadkach
Tam, gdzie wiadomo, że strumień danych tekstowych to zwykły tekst, ale o nieznanym kodowaniu, BOM może być użyty jako podpis. Jeśli nie ma BOM, kodowanie może być cokolwiek.
Tam, gdzie wiadomo, że strumień danych tekstowych jest zwykłym tekstem Unicode (ale nie który endian), BOM może być użyty jako podpis. Jeśli nie ma BOM, tekst należy interpretować jako big-endian.
Niektóre protokoły bajtowe oczekują znaków ASCII na początku pliku. Jeśli UTF-8 jest używany z tymi protokołami, należy unikać korzystania z BOM jako podpisu formularza kodowania.
Tam, gdzie znany jest dokładny typ strumienia danych (np. Unicode big-endian lub Unicode little-endian), BOM nie powinien być używany. W szczególności, ilekroć strumień danych zostanie zadeklarowany jako UTF-16BE, UTF-16LE, UTF-32BE lub UTF-32LE, nie wolno używać BOM.
Od http://en.wikipedia.org/wiki/Byte-order_mark :
Znak kolejności bajtów (BOM) to znak Unicode używany do sygnalizowania endianizmu (kolejności bajtów) pliku tekstowego lub strumienia. Jego kod to U + FEFF. Użycie BOM jest opcjonalne i, jeśli jest używane, powinno pojawić się na początku strumienia tekstowego. Oprócz specyficznego zastosowania jako wskaźnika kolejności bajtów, znak BOM może również wskazywać, w której z kilku reprezentacji Unicode jest zakodowany tekst.
Zawsze użycie BOM w twoim pliku zapewni, że zawsze otworzy się poprawnie w edytorze obsługującym UTF-8 i BOM.
Mój prawdziwy problem z brakiem BOM jest następujący. Załóżmy, że mamy plik zawierający:
abc
Bez BOM jest to otwierane jako ANSI w większości edytorów. Tak więc inny użytkownik tego pliku otwiera go i dodaje niektóre znaki rodzime, na przykład:
abg-αβγ
Ups ... Teraz plik jest nadal w ANSI i zgadnij co, „αβγ” nie zajmuje 6 bajtów, ale 3. To nie jest UTF-8, a to powoduje inne problemy w późniejszym etapie łańcucha rozwoju.
Oto moje doświadczenia z wnioskami ściągania Visual Studio, Sourcetree i Bitbucket, co sprawiało mi pewne problemy:
Okazuje się, że BOM z podpisem będzie zawierać znak czerwonej kropki na każdym pliku podczas przeglądania żądania ściągnięcia (może to być dość denerwujące).
Jeśli najedziesz na niego kursorem, wyświetli się znak taki jak „ufeff”, ale okazuje się, że Sourcetree nie wyświetla tego typu znaków bajtowych, więc najprawdopodobniej skończy się na twoich żądaniach ściągania, co powinno być ok, ponieważ tak właśnie Visual Studio 2017 koduje teraz nowe pliki, więc może Bitbucket powinien to zignorować lub pokazać w inny sposób, więcej informacji tutaj:
UTF z BOM jest lepszy, jeśli używasz UTF-8 w plikach HTML i jeśli używasz serbskiej cyrylicy, serbskiej łaciny, niemieckiej, węgierskiej lub jakiegoś egzotycznego języka na tej samej stronie.
Tak oceniam (30 lat branży komputerowej i informatycznej).