Malzeme Listesi olmadan UTF-8 ve UTF-8 arasındaki fark nedir?


818

Malzeme Listesi olmadan UTF-8 ve UTF-8 arasında ne fark vardır ? Hangisi daha iyi?


77
UTF-8, içerik olarak BOM'den daha iyi otomatik olarak algılanabilir. Yöntem basit: dosyayı (veya bir dizeyi) UTF-8 olarak okumaya çalışın ve bu başarılı olursa verilerin UTF-8 olduğunu varsayın. Aksi takdirde CP1252 (veya başka bir 8 bit kodlama) olduğunu varsayın. Herhangi bir UTF-8 olmayan sekiz bit kodlaması neredeyse kesinlikle UTF-8 tarafından izin verilmeyen diziler içerecektir. Saf ASCII (7 bit) UTF-8 olarak yorumlanır, ancak sonuç da bu şekilde doğrudur.
Tronic

39
Büyük dosyaları UTF-8 içeriği için taramak zaman alır. Bir malzeme listesi bu süreci çok daha hızlı hale getirir. Pratikte genellikle her ikisini de yapmanız gerekir. Günümüzde suçlu, hala çok fazla metin içeriğinin Unicode olmadığı ve hala Unicode (örneğin UTF-8) yaptıklarını ancak içeriklerini farklı bir kod sayfası yaydıklarını söyleyen araçlara çarpıyorum.
Jeroen Wiert Pluimers

10
@Tronic Bu durumda "daha iyi" nin uygun olduğunu düşünmüyorum . Çevreye bağlıdır. Eğer varsa emin tüm UTF-8 dosyaları ile işaretlendiğini BOM denetimi daha BOM olan "daha iyi" daha hızlı ve daha güvenilir olduğu için, yol.
mg30rg

32
UTF-8'in ürün ağacı yoktur. UTF-8 dosyasının başına bir U + FEFF kod noktası koyduğunuzda, bununla başa çıkmak için özel dikkat gösterilmelidir. Bu, Microsoft adlandırma yalanlarından sadece bir tanesidir, böyle bir şey olmadığında kodlama "Unicode" olarak adlandırmak gibi.
tchrist

7
"Modern Mainframe (AIX) little endian UTF-8 farkındadır" UTF-8 bir yok uçluluk ! belirli bir sistem için doğru "düzene" çiftler veya dörtlü gruplar koymak için etrafında bayt karıştırılması yoktur! Bir UTF-8 bayt dizisini saptamak için, çok baytlı bir dizi "kod noktası" nın ("düz" ASCII olanlar DEĞİLDİR baytlar) ilk baytının MS bit ayarına ve hepsinin birden bire üçe kadar olduğunu not etmek yararlı olabilir. art arda daha az önemli bitler ve ardından sıfırlama biti. Bu set bitlerinin toplam sayısı, bu kod
noktasında

Yanıtlar:


773

UTF-8 BOM, bir metin akışının ( ) başlangıcında , okuyucunun bir dosyayı UTF-8'de kodlanmış olarak daha güvenilir bir şekilde tahmin etmesini sağlayan bir bayt dizisidir 0xEF, 0xBB, 0xBF.

Normalde BOM , bir kodlamanın endianitesini belirtmek için kullanılır , ancak endianite UTF-8 ile alakasız olduğundan BOM gereksizdir.

Göre Unicode standardı , UTF-8 dosyaları için BOM tavsiye edilmez :

2.6 Kodlama Şemaları

... Malzeme Listesi'nin kullanımı ne UTF-8 için ne gerekli değildir, ne de tavsiye edilir, ancak UTF-8 verilerinin Malzeme Listesi kullanan diğer kodlama formlarından dönüştürüldüğü veya Malzeme Listesinin UTF-8 imzası olarak kullanıldığı bağlamlarda karşılaşılabilir. . Daha fazla bilgi için Bölüm 16.8'deki Özel ( Byte Order Mark) alt bölümüne bakınız .


114
Tavsiye edilmeyebilir, ancak İbranice dönüşümlerindeki deneyimimden BOM bazen Excel'deki UTF-8 tanıma için çok önemlidir ve Cibrish ile İbranice arasındaki fark yaratabilir
Matanya

26
Tavsiye edilmeyebilir ama "æøå" çıktısını almaya çalışırken powershell betiğime harikalar yaptı
Marius

63
Standart tarafından önerilmemesine bakılmaksızın, izin verilir ve büyük ölçüde varsayım veya tahmin alternatifleri yerine UTF-8 imzası gibi davranmayı tercih ederim. Unicode uyumlu yazılımın varlığıyla başa çıkabilmesi / başa çıkabilmesi gerekir, bu yüzden kişisel olarak kullanımını teşvik ediyorum.
martineau

30
@ bames53: Evet, ideal bir dünyada metin dosyalarının kodlamasını dosya sistemi meta verileri olarak depolamak onu korumanın daha iyi bir yolu olacaktır. Ancak gerçek dünyada yaşayan çoğumuz, programlarımızın çalıştığı işletim sistemlerinin dosya sistemini değiştiremiyoruz - bu nedenle Unicode standardının platformdan bağımsız BOM imzasını kullanmak en iyi ve en pratik alternatif IMHO gibi görünüyor.
martineau

34
@martineau Dün dün UTF-8 olmayan bir UTF-8 BOM dosyasıyla karşılaştım (CP936 idi). Talihsiz olan, UTF-8 BOM'un neden olduğu muazzam miktarda ağrıdan sorumlu olanların büyük ölçüde habersiz olmasıdır.
16:14

243

Diğer mükemmel cevaplar zaten şunları yanıtladı:

  • UTF-8 ve BOM-ed UTF-8 arasında resmi bir fark yoktur.
  • Bir BOM-ed UTF-8 dizesi aşağıdaki üç baytla başlayacaktır. EF BB BF
  • Varsa, bu baytlar dosya / akıştan dize çıkarılırken yoksayılmalıdır.

Ancak, buna ek bilgi olarak, UTF-8 için BOM, bir dize UTF-8'de kodlanmışsa "koklamak" için iyi bir yol olabilir ... Veya başka herhangi bir kodlamada meşru bir dize olabilir ...

Örneğin, [EF BB BF 41 42 43] verileri şunlardan biri olabilir:

Bu nedenle, ilk baytlara bakarak bir dosya içeriğinin kodlamasını tanımak güzel olsa da, yukarıdaki örnekte gösterildiği gibi buna güvenmemelisiniz

Kodlamalar bilinmeli, ilahi değil.


60
@Alcott: Doğru anladın. [EF BB BF 41 42 43] dizesi sadece bir bayt bayttır. Nasıl yorumlanacağını seçmek için harici bilgilere ihtiyacınız vardır. Bu baytların ISO-8859-1 kullanılarak kodlandığını düşünüyorsanız, dize "ï» ¿ABC "olur. Bu baytların UTF-8 kullanılarak kodlandığını düşünüyorsanız, "ABC" olur. Eğer bilmiyorsanız, bulmaya çalışmalısınız. Malzeme Listesi bir ipucu olabilir. UTF-8 olarak kod çözüldüğünde geçersiz karakterin olmaması başka olabilir ... Sonunda, bir şekilde kodlamayı ezberleyemez / bulamazsanız, bir bayt dizisi sadece bir bayt dizisidir.
paercebal

19
@paercebal "ï» ¿" iken öyle, geçerli latin 1'dir çok bir metin dosyası bu kombinasyonu ile başlar olası. Aynısı ucs2-le / be işaretleri þþ ve þÿ için de geçerlidir. Ayrıca asla bilemezsiniz.
user877329

16
@deceze Muhtemelen dilsel olarak geçersizdir: İlk önce ï (tamam), daha sonra aralarında boşluk olmayan bazı tırnak işaretleri (tamam değil). Spanish İspanyolca olduğunu gösterir, ï İspanyolca'da kullanılmaz. Sonuç: Latin-1 değil, kesinliği olmadan kesinliği aşmaktadır.
user877329

20
@user Tabii, mutlaka mantıklı değil. Ancak sisteminiz tahmin etmeye güveniyorsa, belirsizliklerin ortaya çıktığı yer burasıdır. Bazı kötü niyetli kullanıcılar bu 3 harfle başlayan metni gönderir ve sisteminiz aniden UTF-8'e bir Malzeme Listesi ile baktığını varsayar, metni UTF-8 olarak kabul eder. Latin-1 kullanmalıdır ve bazı Unicode enjeksiyonları gerçekleşir. Sadece varsayımsal bir örnek, ama kesinlikle mümkün. Bir metni içeriğine göre kodlayamazsınız, nokta.
deceze

40
"Kodlamalar bilinmeli, ilahi değil." Sorunun kalbi ve ruhu. +1, iyi efendim. Başka bir deyişle: içeriğinizi standart hale getirin ve "Her zaman bu kodlamayı kullanıyoruz. Dönem. Bu şekilde yazın. Bu şekilde okuyun" deyin ya da kodlamanın meta veri olarak depolanmasına izin veren genişletilmiş bir biçim geliştirin. (İkincisi muhtemelen bazı "bootstrap standart kodlamasına" ihtiyaç duyar. "Kodlamayı söyleyen kısım her zaman
ASCII'dir

135

UTF-8 kodlu dosyalara ürün ağacı koymanın en az üç sorunu vardır.

  1. Metin içermeyen dosyalar artık her zaman ürün ağacı içerdiği için boş bırakılmaz.
  2. UTF-8'in ASCII alt kümesinde bulunan metni içeren dosyalar artık ASCII değildir çünkü BOM, mevcut araçların bozulmasına neden olan ASCII değildir ve kullanıcıların bu tür eski araçları değiştirmeleri imkansız olabilir.
  3. Her dosyanın başında bir malzeme listesi olduğundan, birkaç dosyayı birlikte birleştirmek mümkün değildir.

Diğerlerinin de belirttiği gibi, bir şeyin UTF-8 olduğunu tespit etmek için bir Malzeme Listesine sahip olmak ne yeterli ne de gerekli:

  • Bu yeterli değildir, çünkü keyfi bir bayt sekansı Malzeme Listesini oluşturan tam sekansla başlayabilir.
  • Gerekli değildir, çünkü baytları UTF-8miş gibi okuyabilirsiniz; başarılı olursa, tanım gereği geçerli UTF-8'dir.

8
Yeniden nokta 1 "Metin içermeyen dosyalar artık her zaman ürün ağacını içerdiğinden artık boş değildir", bu (1) işletim sistemi dosya sistemi düzeyini yorumlanan içerik düzeyiyle sınırlandırır ve ayrıca (2) yanlış ürün ağacını kullanmanın BOM ayrıca her boş dosyada. (1) 'e pratik çözüm yapmamaktır (2). Esasen şikayet, "BOM'u başka türlü boş bir dosyaya pratik olarak koymak ve böylece mantıksal olarak boş dosyanın en kolay algılanmasını (dosya boyutunu kontrol ederek) önlemek" olarak azalır. Hala iyi bir yazılım onunla başa çıkabilmelidir, çünkü bir amacı vardır.
Şerefe ve s. - Alf

7
Yeniden nokta 2, "ASCII metnini tutan dosyalar artık ASCII değildir", bu ASCII'yi UTF-8 ile sınırlar. ASCII metnini tutan bir UTF-8 dosyası ASCII değil, UTF-8'dir. Benzer şekilde, ASCII metnini tutan bir UTF-16 dosyası ASCII değil, UTF-16'dır. Ve bunun gibi. ASCII 7 bit tek baytlık bir koddur. UTF-8, ASCII'nin 8 bit değişken uzunluklu bir uzantısıdır. 127'den fazla değerden dolayı "araçlar bozulursa" 8 bit bir dünya için uygun değildir. Basit bir pratik çözüm, ASCII olmayan bayt değerlerini ayıran araçlarla yalnızca ASCII dosyalarını kullanmaktır. Muhtemelen daha iyi bir çözüm, bu unchood aletlerini atmaktır.
Şerefe ve s. - Alf

8
Yeniden nokta 3, "Birkaç dosya birlikte birleştirmek mümkün değildir, çünkü her dosya şimdi başında BOM var" sadece yanlış. UTF-8 dosyalarını BOM ile birleştirirken sorun yaşamadım, bu yüzden açıkça mümkün. Belki de Unix-land'ın catsize temiz bir sonuç vermeyeceğini , sadece başlangıçta ürün ağacının bulunduğu bir sonucu kastettiğinizi düşünüyorum . Bunu demek istediyseniz, bunun nedeni cat, yorumlanmış içerik düzeyinde değil, bayt düzeyinde çalışmanın ve benzer şekilde catfotoğraflarla baş edemeyeceğidir. Yine de çok fazla zarar vermiyor. Çünkü Malzeme Listesi sıfır genişlikli, kırılmaz bir alan kodlar.
Şerefe ve s. - Alf

20
@ Cheersandhth.-Alf Bu cevap doğru. Yalnızca Microsoft hatalarına işaret ediyorsunuz.
tchrist

9
@brighty: Bomba eklenerek durum hiç iyileşmedi.
Tekilleştirici

84

İşte gerçek sorunlara neden olan Malzeme Listesi kullanımına ilişkin örnekler ve yine de birçok insan bunu bilmiyor.

BOM komut dosyalarını bozuyor

Kabuk komut dosyaları, Perl komut dosyaları, Python komut dosyaları, Ruby komut dosyaları, Node.js komut dosyaları veya bir yorumlayıcı tarafından çalıştırılması gereken diğer yürütülebilir dosyalar - tümü bunlardan birine benzeyen bir shebang satırıyla başlar :

#!/bin/sh
#!/usr/bin/python
#!/usr/local/bin/perl
#!/usr/bin/env node

Sisteme böyle bir komut dosyası çağrılırken hangi tercümanın çalıştırılması gerektiğini söyler. Komut dosyası UTF-8 olarak kodlanmışsa, başında bir malzeme listesi eklemek cazip gelebilir. Ama aslında "#!" karakterler sadece karakter değildir. Aslında iki ASCII karakterden oluşan sihirli bir sayıdır . Bu karakterlerin önüne bir şey (BOM gibi) koyarsanız, dosya farklı bir sihirli numaraya sahip gibi görünür ve bu da sorunlara yol açabilir.

Vikipedi, makale: Shebang, bölüm: Sihir numarası :

Gizli karakterler, geçerli Unix benzeri sistemlerde komut dosyaları ve diğer metin dosyaları için yaygın olarak kullanılan UTF-8 dahil olmak üzere genişletilmiş ASCII kodlamalarında aynı iki baytla temsil edilir. Ancak, UTF-8 dosyaları isteğe bağlı bayt sırası işaretiyle (BOM) başlayabilir; "exec" işlevi özellikle 0x23 ve 0x21 baytlarını algılarsa, shebang'dan önce BOM'un (0xEF 0xBB 0xBF) varlığı kod yorumlayıcısının yürütülmesini engelleyecektir.Bazı yetkililer POSIX (Unix benzeri) betiklerde [14] bayt sırası işaretini bu nedenle ve daha geniş birlikte çalışabilirlik ve felsefi kaygılar için kullanmamalarını tavsiye etmektedir. Ayrıca, kodlamanın endianness sorunları olmadığı için UTF-8'de bir bayt sırası işareti gerekli değildir; yalnızca kodlamayı UTF-8 olarak tanımlamaya yarar. [vurgu eklendi]

JSON'da BOM yasadışı

Bkz. RFC 7159, Bölüm 8.1 :

Uygulamalar, JSON metninin başına bayt sırası işareti eklememelidir * ZORUNLU *.

JSON'da BOM gereksizdir

Sadece JSON'da yasadışı değildir , aynı zamanda karakter kodlamasını belirlemek de gerekmez , çünkü herhangi bir JSON akışında kullanılan karakter kodlamasını ve endianitesini açık bir şekilde belirlemek için daha güvenilir yollar vardır ( ayrıntılar için bu cevaba bakınız).

BOM, JSON ayrıştırıcılarını bozuyor

Sadece JSON'da yasadışıdır ve gerekli değildir , aslında RFC 4627'de sunulan yöntemi kullanarak kodlamayı belirleyen tüm yazılımları kırar :

JSON kodlaması ve endianitesinin belirlenmesi, NUL baytının ilk dört baytının incelenmesi:

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

Şimdi, dosya BOM ile başlıyorsa şöyle görünecektir:

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

Bunu not et:

  1. UTF-32BE üç NUL ile başlamıyor, bu yüzden tanınmayacak
  2. UTF-32LE ilk baytı üç NUL izlemez, bu yüzden tanınmaz
  3. UTF-16BE'nin ilk dört baytta yalnızca bir NUL'si olduğundan, tanınmayacak
  4. UTF-16LE'nin ilk dört baytta yalnızca bir NUL değeri olduğundan, tanınmayacak

Uygulamaya bağlı olarak, bunların hepsi yanlış UTF-8 olarak yorumlanabilir ve daha sonra geçersiz UTF-8 olarak yanlış yorumlanabilir veya reddedilebilir veya hiç tanınmayabilir.

Ek olarak, uygulama geçerli JSON'u önerdiğim gibi test ederse, gerçekten UTF-8 olarak kodlanan girişi bile reddedecektir, çünkü RFC'ye göre olması gerektiği gibi <128 ASCII karakteriyle başlamamaktadır.

Diğer veri formatları

JSON'da BOM gerekli değildir, yasadışıdır ve RFC'ye göre doğru çalışan yazılımı keser. O zaman kullanmamak bir nobrainer olmalı ve yine de, BOM'ları, yorumları, farklı alıntı kurallarını veya farklı veri türlerini kullanarak JSON'u kırmakta ısrar eden insanlar var. Tabii ki kimse ihtiyacınız varsa BOM veya başka bir şey kullanmakta özgürdür - sadece o zaman JSON deme.

JSON dışındaki diğer veri biçimleri için nasıl göründüğüne bir göz atın. Yalnızca kodlamalar UTF- * ise ve ilk karakterin 128'den küçük bir ASCII karakteri olması gerekiyorsa, verilerinizin hem kodlamasını hem de sonlandığını belirlemek için gereken tüm bilgilere zaten sahipsiniz demektir. Malzeme listelerini isteğe bağlı bir özellik olarak bile eklemek yalnızca daha karmaşık ve hataya açık hale gelir.

BOM'un diğer kullanımları

JSON veya script dışındaki kullanımlara gelince, burada çok iyi cevaplar olduğunu düşünüyorum. Özellikle komut dosyası oluşturma ve serileştirme hakkında daha ayrıntılı bilgi eklemek istedim, çünkü gerçek sorunlara neden olan BOM karakterlerinin bir örneği.


5
rfc4627'nin yerine geçen rfc7159 aslında BOM'yi desteklemenin o kadar kötü olmadığını gösteriyor. Temelde bir BOM'ye sahip olmak sadece belirsiz bir çamurdur, böylece Unicode farkında olmayan eski Windows ve Unix yazılımı utf-8'i işleyebilir.
Eric Grange

2
JSON, Perl betikleri, Python betikleri, Ruby betikleri, Node.js ile aynı şekilde desteklenmesi için güncellenmesi gerekiyor gibi görünüyor. Bu platformların destek içermemeyi seçmesi, BOM kullanımını mutlaka öldürmez. Apple birkaç yıldır Adobe'yi öldürmeye çalışıyor ve Adobe hala ortalıkta. Ama aydınlatıcı bir yazı.
htm11h

13
@EricGrange, BOM'yi çok güçlü bir şekilde destekliyor gibi görünüyorsunuz, ancak bunun her yerde bulunan, evrensel olarak kullanışlı, optimal-minimum "düz metin" biçimini UTF8 öncesi geçmişin bir kalıntısı haline getireceğini fark etmiyorsunuz ! Düz metin akışına herhangi bir tür (bant içi) başlık eklemek, tanım gereği, en basit metin dosyalarına zorunlu bir protokol uygular ve bu da bir daha asla "en basit" olmaz! Ne kazancı için? Tüm desteklemek için diğer antik CP kodlamaları da UTF-8 ile sanabilir yüzden, imzalar yoktu? (BTW, ASCII de UTF-8'dir. Peki, onlara da bir Malzeme Listesi?)) Hadi.)
Sz.

2
Bu sorunun cevabını bu soruya geldim! Windows'ta bash betiklerimi oluşturuyorum ve bu betikleri Linux'ta yayınlarken birçok sorun yaşıyorum! Jason dosyaları ile aynı şey.
Tono Nam

2
Keşke bu cevabı yaklaşık elli kez oylayabilseydim. Bu noktada UTF-8'in standart savaşı kazandığını ve internette üretilen neredeyse tüm metinlerin UTF-8 olduğunu da eklemek istiyorum. En popüler programlama dillerinden bazıları (C # ve Java gibi) dahili olarak UTF-16 kullanır, ancak bu dilleri kullanan programcılar akışları çıktılamak için dosya yazdıklarında, bunları neredeyse her zaman UTF-8 olarak kodlarlar. Bu nedenle, UTF-8 dosyasını işaretlemek için bir ürün ağacına sahip olmak artık mantıklı değil; UTF-8, okurken kullandığınız varsayılan değer olmalıdır ve yalnızca UTF-8 kod çözme başarısız olursa diğer kodlamaları deneyin.
rmunn

51

Malzeme Listesi olmadan UTF-8 ve UTF-8 arasında ne fark vardır?

Kısa yanıt: UTF-8'de, bir Malzeme Listesi EF BB BFdosyanın başındaki bayt olarak kodlanır .

Uzun cevap:

Başlangıçta Unicode'un UTF-16 / UCS-2'de kodlanması bekleniyordu . Ürün Ağacı bu kodlama formu için tasarlanmıştır. 2 baytlık kod birimleriniz olduğunda, bu iki baytın hangi sırada olduğunu belirtmeniz gerekir ve bunu yapmak için ortak bir kural, verilerin başında "Bayt Sırası İşareti" olarak U + FEFF karakterini dahil etmektir. U + FFFE karakteri kalıcı olarak atanmamış, böylece varlığı yanlış bayt sırasını tespit etmek için kullanılabilir.

UTF-8, platform endianitesinden bağımsız olarak aynı bayt sırasına sahiptir, bu nedenle bir bayt sırası işaretine gerek yoktur. Bununla birlikte, EF BB FFUTF-16'dan UTF-8'e dönüştürülen verilerde (bayt dizisi olarak ) veya verinin UTF-8 olduğunu belirtmek için bir "imza" olarak ortaya çıkabilir .

Hangisi daha iyi?

Olmadan. Martin Cote'un yanıtladığı gibi, Unicode standardı bunu önermez. BOM farkında olmayan yazılımlarda sorunlara neden olur.

Bir dosyanın UTF-8 olup olmadığını tespit etmenin daha iyi bir yolu, geçerlilik kontrolü yapmaktır. UTF-8'in hangi bayt dizilerinin geçerli olduğuna dair katı kuralları vardır, bu nedenle yanlış pozitif olasılığı ihmal edilebilir. Bir bayt dizisi UTF-8'e benziyorsa, büyük olasılıkla öyledir.


8
bu da, içinde tek bir hatalı bayt bulunan geçerli UTF-8'i geçersiz kılacaktır: /
endolith

8
-1 yeniden "Bu BOM farkında olmayan yazılım ile sorunlara neden olur.", Bu benim için hiçbir zaman sorun değildi, aksine, BOM yok BOM farkında yazılım (özellikle Visual C ++) ile ilgili sorunlara neden oldu sorun. Dolayısıyla bu ifade platforma özgüdür , dar bir Unix-land bakış açısıdır, ancak genel olarak geçerliymiş gibi yanıltıcı bir şekilde sunulmaktadır. Hangi değil.
Şerefe ve s. - Alf

6
Hayır, UTF-8'in ürün ağacı yoktur. Bu cevap yanlış. Unicode Standardına bakın.
tchrist

2
Sadece baytlara bakarken saf bir ASCII dosyanız olduğunu bile düşünebilirsiniz. Ancak bu, baytlara değil, kelimelere bakmanız gereken bir utf-16 dosyası olabilir. Modern yazılımlar ürün ağacından haberdar olmalıdır. Geçersiz dizileri, daha küçük bir diziyi kullanabilen kod noktalarını veya vekil olan kod noktalarını tespit ederseniz utf-8 okuma yine de başarısız olabilir. Utf-16 için artık yetim vekiller varsa okuma da başarısız olabilir.
brighty

1
@Alf, BOM dışı bir tutumu " platforma özgü , dar bir Unix-land bakış açısı" olarak yorumladığınıza katılmıyorum . Bana göre, dar görüşlülüğün "Unix toprağı" ile yatmasının tek yolu, MS ve Visual C ++ 'ın yapmadığı * NIX'ten önce gelmesiydi. MS (Ben bilerek varsayıyorum) UTF-8 yerine UTF-16 bir BOM kullanmaya başladı aslında onlar kırarak terfi bana önerir sh, perl, g++ve diğer birçok ücretsiz ve güçlü araçlar. İşlerin çalışmasını ister misiniz? Sadece MS sürümlerini satın alın . MS, platforma özgü sorunu, tıpkı \ x80- \ x95 menzillerinin felaketi gibi yarattı.
bballdave025

30

BOM'li UTF-8 daha iyi tanımlanır. Bu sonuca zor yoldan ulaştım. Sonuçlardan birinin Unicode karakterler de dahil olmak üzere bir CSV dosyası olduğu bir proje üzerinde çalışıyorum .

CSV dosyası bir Malzeme Listesi olmadan kaydedilirse, Excel bunun ANSI olduğunu düşünür ve anlamsızlık gösterir. Önde "EF BB BF" ekledikten sonra (örneğin, UTF-8 ile Not Defteri veya BOM ile UTF-8 ile Notepad ++ kullanarak yeniden kaydederek), Excel'i açar.

Malzeme Listesi karakterini Unicode metin dosyalarına hazırlamak RFC 3629 tarafından önerilmektedir: "UTF-8, ISO 10646 dönüşüm biçimi", Kasım 2003, http://tools.ietf.org/html/rfc3629 (bu son bilgi şu adreste bulunur: http://www.herongyang.com/Unicode/Notepad-Byte-Order-Mark-BOM-FEFF-EFBBBF.html )


6
Birinin Excel tarafından kullanılmak üzere UTF-8 dosyaları oluşturması durumunda bu mükemmel ipucu için teşekkürler. Yine de diğer durumlarda, yine de diğer cevapları takip eder ve ürün ağacını atlarım.
barfuin

5
Yalnızca ASCII içeren ve daha sonra ASCII içermeyen dosyalar oluşturduğunuzda da kullanışlıdır. Ben sadece böyle bir sorunla karşılaştı: utf8 bekliyor yazılım, kullanıcı düzenleme için bazı verilerle dosya oluşturur. İlk dosya yalnızca ASCII içeriyorsa, bazı editörlerde açılır ve kaydedilirse, latin-1 ile biter ve her şey bozulur. Malzeme Listesini eklersem, editör tarafından UTF8 olarak algılanır ve her şey çalışır.
Roberto Alsina

1
BOM UTF-8 dosyalarını doğru bir şekilde tanımasını gerektiren çoklu programlama ile ilgili araçlar buldum. Visual Studio, SSMS, SoureTree ....
kjbartel

5
Bu RFC'de ürün ağacı kullanma önerisini nerede okuyorsunuz ? En fazla, bunu yapmanın zor olduğu bazı durumlarda yasaklamamanız için güçlü bir öneri vardır.
Tekilleştirici

8
Excel, ANSI olduğunu düşünüyor ve anlamsız gösteriyor, sonra sorun Excel'de.
Isaac

17

BOM bir yerde, bir yerde patlama (amaçlanan cinas (sic)) eğilimindedir. Ve patladığında (örneğin, tarayıcılar, editörler vb. Tarafından tanınmazsa), belgenin başlangıcında garip karakterler olarak görünür (örneğin, HTML dosyası, JSON yanıtı, RSS , vb.) ve Obama'nın Twitter'da konuşması sırasında yaşanan son kodlama sorunu gibi utançlara neden oluyor .

Hata ayıklaması zor yerlerde göründüğünde veya testler ihmal edildiğinde çok can sıkıcıdır. Bu yüzden kullanmak zorunda olmadığınız sürece bundan kaçınmak en iyisidir.


Evet, BOM olmadan UTF-8 yerine bir dosyanın UTF-8 olarak kodlanmasından kaynaklanan bir sorunu tanımlamak için saatler harcadık. (Sorun sadece IE7'de ortaya çıktı, bu yüzden beni oldukça kaz bir kovalamacaya
götürdüm

Gelecekteki okuyucular: Yukarıda bahsettiğim tweet sorununun kesinlikle BOM ile ilgili olmadığını, ancak eğer öyleyse, tweet benzer bir şekilde, ancak tweet'in başında karıştırılacağını unutmayın.
Halil Özgür

12
@ user984003 Hayır, sorun Microsoft'un sizi yanlış yönlendirmesidir. UTF-8 olarak adlandırdığı şey UTF-8 değildir. BOM olmadan UTF-8 olarak adlandırdığı şey UTF-8'in gerçekte ne olduğudur.
tchrist

"sic" ne "amaçlanan hiçbir kelime" ne ekler
JoelFan

2
@JoelFan Artık hatırlayamıyorum ama sanırım yazarın iddiasına rağmen cinayet amaçlanmış olabilir :)
Halil Özgür

17

Soru: Malzeme Listesi olmadan UTF-8 ve UTF-8 arasında ne fark vardır? Hangisi daha iyi?

İşte bayt sırası işareti (BOM) hakkındaki Wikipedia makalesinden, bu soruya sağlam bir cevap sunduğuna inandığım bazı alıntılar .

Malzeme Listesinin ve UTF-8'in anlamı hakkında:

Unicode Standardı izin BOM içinde UTF-8 , fakat gerektiren veya kullanımını önermez. Bayt sırasının UTF-8'de bir anlamı yoktur, bu nedenle UTF-8'deki tek kullanımı başlangıçta metin akışının UTF-8'de kodlandığını bildirmektir.

Malzeme Listesinin KULLANILMAMASI argümanı :

Bir ürün ağacı kullanmamanın birincil motivasyonu Unicode farkında olmayan yazılımlarla geriye dönük uyumluluktur ... Bir ürün ağacı kullanmamanın bir başka amacı da UTF-8'i "varsayılan" kodlama olarak teşvik etmektir.

Argüman İÇİN Bir BOM kullanılarak:

Malzeme Listesini kullanma argümanı, onsuz, bir dosyayı kodlayan karakteri hangi karakteri kullandığını belirlemek için sezgisel analiz yapılması gerektiğidir. Tarihsel olarak, bu tür analizler, çeşitli 8-bit kodlamaları ayırt etmek için karmaşık, hata eğilimli ve bazen yavaştır. Mozilla Universal Charset Detector ve Unicode Uluslararası Bileşenleri gibi görevi kolaylaştırmak için bir dizi kütüphane mevcuttur.

Programcılar yanlışlıkla UTF-8'in saptanmasının eşit derecede zor olduğunu varsaymaktadır (bayt dizilerinin büyük çoğunluğunun geçersiz UTF-8 olması nedeniyle değildir, bu kütüphanelerin kodlamaları mümkün olan tüm bayt dizilerine izin vermeye çalışmaktadır). Bu nedenle, Unicode kullanan tüm programlar böyle bir analiz yapmaz ve bunun yerine Malzeme Listesine dayanır.

Özellikle, Microsoft derleyicileri ve yorumlayıcıları ve Notepad gibi Microsoft Windows üzerindeki birçok yazılım parçası, yalnızca ASCII karakterleri veya BOM ile başlamadığı sürece UTF-8 metnini doğru bir şekilde okumaz ve kaydetme sırasında bir BOM ekler UTF-8 olarak metin. Bir Microsoft Word belgesi düz metin dosyası olarak indirildiğinde Google Dokümanlar bir ürün ağacı ekler.

Hangi günü, daha da İLE veya OLMADAN BOM:

IETF bir protokol ya (a) her zaman kullanıyorsa UTF-8, veya (b) kodlaması kullanılıyor neyi göstermek için başka bir yol, o zaman sahip önerir “imza olarak U + FEFF kullanımını yasaklamak GEREKEN.”

Kanımca:

Malzeme Listesini yalnızca bir yazılım uygulamasıyla uyumluluk kesinlikle gerekliyse kullanın.

Başvurulan Wikipedia makalesinde, birçok Microsoft uygulamasının UTF-8'i doğru bir şekilde algılamak için Malzeme Listesine dayandığını göstermesine rağmen, bu tüm Microsoft uygulamaları için geçerli değildir . Örneğin, tarafından sivri out gibi @barlop UTF-8 ile İstemi, Windows Command kullanırken, , böyle komutları typeve moreBOM mevcut olması beklemeyin. BOM halinde olan mevcut diğer uygulamalar için olduğu gibi, bu sorun yaratabilir.


chcpKomut, 65001 kod sayfası aracılığıyla UTF-8 ( BOM olmadan ) desteği sunar .


5
Malzeme Listesi OLMADAN katı olsam iyi olur . Bunu buldum .htaccessve gzip compressionaçıklanmış olan UTF-8 BOM ile kombinasyon halinde bir öneriye BOM takip yapılmayan UTF-8 Kodlama'nın bir kodlama hatası Değişim verir burada sorunları çözmek
Chetabahana

1
'Malzeme listesinin kullanılmaması için bir başka motivasyon UTF-8'i "varsayılan" kodlama olarak teşvik etmektir. - Bu kadar güçlü ve geçerli bir argüman, oradaki cevabı gerçekten durdurabilirsiniz! ...; -o Evrensel metin temsili için daha iyi bir fikriniz olmadığı sürece, yani. ;) (Kaç yaşında olduğunuzu bilmiyorum, UTF8 öncesi dönemde kaç yıl acı çekmeniz gerekti (dilbilimciler umutsuzca alfabe değiştirmeyi düşündüklerinde), ama her saniyede binmeye yaklaştığımızı söyleyebilirim "bir"
değerine

Ayrıca bkz Bu yorumu bir BOM eklemek nasıl (ya da bir şey!) Metin dosyası formatlarını en kolayına, "düz metin", tam olarak önlenmesi anlamına geleceğini iyi evrensel metin kodlama biçimi "basit" "düz" olmaktan ve (yani "haksız")! ...
Sz.

BOM çoğunlukla Linux'ta sorunludur, çünkü birçok yardımcı program Unicode'u başlamak için gerçekten desteklemez (örneğin kod noktalarının ortasında mutlu bir şekilde kısalırlar). Diğer modern yazılım ortamlarının çoğunda, kodlama net olmadığında (özellikler veya meta veriler aracılığıyla) ürün ağacını kullanın.
Eric Grange

9

Bu sorunun zaten bir milyonluk bir cevabı var ve birçoğu oldukça iyi, ama bir ürün ağacının ne zaman kullanılması gerektiğini ya da kullanılmaması gerektiğini açıklığa kavuşturmak istedim.

Belirtildiği gibi, bir dizenin UTF-8 olup olmadığını belirlemede UTF Malzeme Listesinin (Byte Order Mark) herhangi bir kullanımı eğitimli bir tahmindir. Uygun meta veriler varsa (gibi charset="utf-8"), o zaman ne kullanmanız gerektiğini zaten biliyorsunuzdur, ancak aksi takdirde bazı varsayımları test etmeniz ve yapmanız gerekir. Bu, bir dizenin geldiği dosyanın onaltılık bayt kodu EF BB BF ile başlayıp başlamadığını kontrol etmeyi içerir.

UTF-8 BOM'sine karşılık gelen bir bayt kodu bulunursa, bunun UTF-8 olduğunu varsayacak kadar yüksektir ve oradan gidebilirsiniz. Bununla birlikte, bu tahminde bulunmaya zorlandığında, okuma sırasında ek hata kontrolü, bir şeyin bozuk olması durumunda hala iyi bir fikir olacaktır. Yalnızca bir girdinin kaynağına göre UTF-8 olmaması gerektiğinde bir Malzeme Listesinin UTF-8 (yani latin-1 veya ANSI) olmadığını varsaymalısınız . Bununla birlikte, ürün ağacı yoksa, kodlamaya karşı doğrulayarak UTF-8 olması gerekip gerekmediğini belirleyebilirsiniz.

Ürün ağacı neden önerilmiyor?

  1. Unicode farkında olmayan veya uyumlu olmayan bir yazılım, latin-1 veya ANSI olduğunu varsayabilir ve ürün ağacını dizeden çıkarmaz; bu da sorunlara neden olabilir.
  2. Gerçekten gerekli değildir (içeriklerin uyumlu olup olmadığını kontrol edin ve uyumlu bir kodlama bulunamadığında her zaman UTF-8'i yedek olarak kullanın)

Ne zaman ürün ağacıyla kodlamanız gerekir ?

Meta verileri başka bir şekilde (bir karakter kümesi etiketi veya dosya sistemi meta aracılığıyla) kaydedemiyorsanız ve Malzeme Listeleri gibi kullanılan programları bir Malzeme Listesiyle kodlamanız gerekir. Bu özellikle, ürün ağacı içermeyen herhangi bir şeyin genellikle eski bir kod sayfası kullandığı varsayıldığı Windows için geçerlidir. Malzeme Listesi, Office gibi programlara, evet, bu dosyadaki metnin Unicode olduğunu söyler; İşte kullanılan kodlama.

Konu söz konusu olduğunda, gerçekten sorun yaşadığım dosyalar CSV'dir. Programa bağlı olarak, bir ürün ağacına sahip olmalı ya da olmamalıdır. Örneğin, Windows'ta Excel 2007+ kullanıyorsanız, düzgün bir şekilde açmak ve verileri içe aktarmak için başvurmak zorunda değilseniz, bir Malzeme Listesi ile kodlanmalıdır.


2
Yanıtınızın son bölümü% 100 doğrudur: Malzeme Listesini kullanmanın tek nedeni, bilinmeyen dosyaları ayrıştırmak için varsayılan olarak UTF-8 kullanmayan buggy yazılımlarıyla birlikte çalışmanız gerektiğidir.
rmunn

8

Bazı dosyalar için Windows'ta bile BOM'ye sahip olmamanız gerektiğine dikkat edilmelidir . Örnekler SQL*plusveya VBScriptdosyalar. Bu tür dosyalarda ürün ağacı varsa, bunları yürütmeye çalıştığınızda bir hata alırsınız.


8

BOM içeren UTF-8 yalnızca dosyada bazı ASCII olmayan karakterler varsa yardımcı olur. Dahil edilirse ve yoksa, dosyayı normalde düz ASCII olarak yorumlayan daha eski uygulamaları bozar. Bu uygulamalar ASCII olmayan bir karakterle karşılaştıklarında kesinlikle başarısız olurlar, bu yüzden BOM sadece dosya ASCII olarak yorumlanabiliyorsa ve yorumlanamazsa eklenmelidir.

Ürün ağacına sahip olmamayı tercih ettiğimi açıkça belirtmek istiyorum. Bazı eski çöpler onsuz kırılırsa ve eski uygulamanın yerine geçmesi mümkün değilse ekleyin.

UTF-8 için bir malzeme listesi beklemeyin.


7

Malzeme Listesinde Wikipedia sayfasının alt kısmında alıntı: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2

"UTF-8 için bir Malzeme Listesinin kullanılması ne gerekli ne de tavsiye edilir, ancak UTF-8 verilerinin bir Malzeme Listesini kullanan veya Malzeme Listesinin UTF-8 imzası olarak kullanıldığı diğer kodlama formlarından dönüştürüldüğü bağlamlarda görülebilir"


2
Yazılımın, kodladığı önceki kodlamanın bir ürün ağacına sahip olup olmadığına bağlı olarak UTF-8'in BOM ile / BOM olmadan kullanılıp kullanılmayacağına karar verdiği herhangi bir örneğiniz var mı ?! Bu saçma bir iddia gibi görünüyor
barlop

7

BOM'siz UTF-8'in BOM'si yoktur, bu da dosyanın tüketicisinin UTF-8 kodlu olup olmadığını bilmesi (veya bilmekten faydalanması) dışında BOM ile UTF-8'den daha iyi yapmaz. ya da değil.

BOM genellikle, çoğu kullanım durumunda gerekli olmayan kodlamanın endianitesini belirlemek için yararlıdır.

Ayrıca, BOM, bilmeyen veya ilgilenmeyen tüketiciler için gereksiz gürültü / ağrı olabilir ve kullanıcının karışmasına neden olabilir.


2
"UTF-8 için hiçbir faydası yoktur, çünkü yine de glif başına 8 bittir." Ee ... hayır, sadece ASCII-7 glifleri UTF-8'de 8 bittir. Bunun ötesinde herhangi bir şey 16, 24 veya 32 bit olacaktır.
Powerlord

3
"Malzeme Listesi genellikle çoğu kullanım durumunda gerekli olmayan kodlamanın endianitesini belirlemek için kullanışlıdır." ...
endianness

6

Buna farklı bir açıdan bakıyorum. Dosya hakkında daha fazla bilgi sağladığı için BOM ile UTF-8 daha iyi olduğunu düşünüyorum . UTF-8'i BOM olmadan sadece sorunlarla karşılaştığımda kullanırım.

Sayfalarımda uzun süre birden fazla dil ( Kiril bile ) kullanıyorum ve dosyalar BOM olmadan kaydedildiğinde ve bunları bir düzenleyici ile düzenlemek için yeniden açtığımda ( cherouvim de belirtildiği gibi), bazı karakterler bozuk.

Yeni oluşturulan bir dosyayı UTF-8 kodlamasıyla kaydetmeye çalıştığınızda Windows'un klasik Not Defteri uygulamasının dosyaları bir Malzeme Listesiyle otomatik olarak kaydettiğini unutmayın.

Kişisel olarak sunucu tarafı komut dosyası dosyalarını (.asp, .ini, .aspx) BOM ve .html dosyalarını BOM olmadan kaydediyorum .


4
Windows klasik Not Defteri hakkında mükemmel ipucu için teşekkürler. Ben zaten aynı şeyi bulmak için biraz zaman geçirdim. Benim sonuç her zaman windows klasik Not Defteri yerine Notepad ++ kullanmak oldu. :-)
barfuin

Madedit kullansan iyi olur. Onaltılık modda, bayt ve karakter arasında 1: 1 Temel yerine utf-8 bayt dizisi seçerseniz bir karakter gösteren tek Editör'dür. UTF-8 dosyasının farkında olan bir hex-Editor, madedit gibi bevave olmalı!
brighty

@brighty BOM uğruna bire bir ihtiyacınız olduğunu düşünmüyorum. önemli değil, utf-8 BOM'un efbbbf veya fffe (yanlış okunursa kahve) olduğunu tanımak fazla zaman almaz. Bu baytları silebilirsiniz. Yine de dosyanın geri kalanı için bir
haritaya

@barlop Dosyanın içeriği utf-8 kodluysa neden bir utf-8 Malzeme Listesini silmek istersiniz? Ürün Ağacı modern Metin Görüntüleyenler, Metin Kontrolleri ve Metin Editörleri tarafından tanınır. Bir utf-8 dizisinin bire bir görünümü anlamsızdır, çünkü n bayt bir karakterle sonuçlanır. Elbette bir metin düzenleyici veya onaltılık düzenleyici herhangi bir baytın silinmesine izin vermelidir, ancak bu geçersiz utf-8 dizilerine yol açabilir.
brighty

@brighty utf-8 bom ile bir kodlama ve utf-8 bom olmadan bir kodlama. Cmd istemi bom olmadan utf8 kullanır .. bu yüzden bir utf8 dosyanız varsa, chcp 65001utf8 desteği için komutu çalıştırın, bom olmadan utf8. Bunu yaparsanız type myfilesadece bom yoksa düzgün bir şekilde görüntülenir. Bunu yaparsanız echo aaa>a.aveya echo אאא>a.a çıkışına karakterleri dosya aa için ve hiçbir BOM ile çıktısı verecektir, chcp 65001 var.
barlop

6

UTF-8 ile kodlanmış bilgileri görüntülemek istediğinizde sorunlarla karşılaşmayabilirsiniz. Örneğin bir HTML belgesini UTF-8 olarak bildirin; tarayıcınızda belgenin gövdesinde bulunan her şeye sahip olursunuz.

Ancak , Windows veya Linux'ta metin, CSV ve XML dosyalarımız olduğunda durum böyle değildir .

Örneğin, Windows veya Linux'ta akla gelebilecek en kolay şeylerden biri olan bir metin dosyası (genellikle) UTF-8 değildir.

XML olarak kaydedin ve UTF-8 olarak bildirin:

<?xml version="1.0" encoding="UTF-8"?>

UTF-8 olarak bildirilmiş olsa bile doğru şekilde görüntülenmeyecek (okunmayacak).

Sendikasyon için XML olarak kaydedilmesi gereken Fransız harfleri içeren bir dizi veri vardı. En baştan bir UTF-8 dosyası oluşturmadan (IDE ve "Yeni Dosya Oluştur" daki seçenekleri değiştirme) veya dosyanın başına ürün ağacı ekleme

$file="\xEF\xBB\xBF".$string;

Fransızca harfleri bir XML dosyasına kaydedemedim.


1
XML'de FTM, dosyayı ASCII olarak tutmalı ve bunun yerine varlıkları kullanmalısınız.
Alois Mahdal

4
Bunun eski bir cevap olduğunu biliyorum, ama bunun yanlış olduğunu belirtmek istiyorum. Linux'taki metin dosyaları (diğer Unix'ler için konuşamaz) genellikle / UTF-8'dir.
Functino

6

Pratik bir fark, Mac OS X için bir kabuk komut dosyası yazar ve düz UTF-8 olarak kaydederseniz, yanıtı alırsınız:

#!/bin/bash: No such file or directory

hangi kabuğu kullanmak istediğinizi belirten shebang hattına yanıt olarak:

#!/bin/bash

UTF-8 olarak kaydederseniz, hiçbir BOM ( BBEdit'te söyleyin ) hepsi iyi olmayacaktır.


8
Çünkü Microsoft, standardın söylediklerinin anlamını değiştirmiştir. UTF-8'in ürün ağacı yok: veri akışının önüne sahte bir ürün ağacı ekleyen Microsoft UTF-8 oluşturdular ve sonra hayır, bunun aslında UTF-8 olduğunu söylediler. O değil. Sadece uzanıyor ve yozlaştırıyor.
tchrist

4

Yukarıda belirtildiği gibi, BOM'li UTF-8, BOM farkında olmayan (veya uyumlu) yazılımlarda sorunlara neden olabilir. Bir keresinde Mozilla tabanlı KompoZer ile UTF-8 + BOM olarak kodlanan HTML dosyalarını WYSIWYG programının gerektirdiği bir istemci olarak düzenledim .

Tasarruf sırasında düzen her zaman yok olur. Bu konuda yolumu açmak biraz zaman aldı. Bu dosyalar daha sonra Firefox'ta iyi çalıştı, ancak Internet Explorer'da düzeni bozan bir CSS tuhaflığı gösterdi. Bağlantılı CSS dosyalarıyla saatlerce uğraştıktan sonra Internet Explorer'ın BOMfed HTML dosyasını beğenmediğini keşfettim. Bir daha asla.

Ayrıca, bunu Wikipedia'da buldum:

Gizli karakterler, geçerli Unix benzeri sistemlerde komut dosyaları ve diğer metin dosyaları için yaygın olarak kullanılan UTF-8 dahil olmak üzere genişletilmiş ASCII kodlamalarında aynı iki baytla temsil edilir. Ancak, UTF-8 dosyaları isteğe bağlı bayt sırası işaretiyle (BOM) başlayabilir; "exec" fonksiyonu özellikle 0x23 0x21 baytlarını algılarsa, shebang'dan önce BOM (0xEF 0xBB 0xBF) varlığı kod yorumlayıcısının yürütülmesini engelleyecektir. Bazı yetkililer POSIX (Unix benzeri) komut dosyalarında, bu nedenle [15] ve daha geniş birlikte çalışabilirlik ve felsefi kaygılar için bayt sırası işaretinin kullanılmamasını önermektedir


4

Unicode Bayt Sipariş İşareti (BOM) SSS kısa bir cevap verir:

S: Malzeme Listeleri ile nasıl başa çıkmalıyım?

C: İzlenmesi gereken bazı yönergeler:

  1. Belirli bir protokol (örneğin .txt dosyaları için Microsoft kuralları) BOM'un dosyalar gibi belirli Unicode veri akışlarında kullanılmasını gerektirebilir. Böyle bir protokole uymanız gerektiğinde bir ürün ağacı kullanın.

  2. Bazı protokoller, etiketsiz metin durumunda isteğe bağlı Malzeme Listelerine izin verir. Bu durumlarda,

    • Metin veri akışının düz metin olduğu, ancak bilinmeyen kodlaması olduğu bilinen yerlerde, Malzeme Listesi imza olarak kullanılabilir. BOM yoksa, kodlama herhangi bir şey olabilir.

    • Bir metin veri akışının düz Unicode metin olduğu biliniyorsa (ancak hangi endian değil), BOM imza olarak kullanılabilir. Malzeme Listesi yoksa, metin big-endian olarak yorumlanmalıdır.

  3. Bazı bayt odaklı protokoller, dosyanın başında ASCII karakterleri bekler. Bu protokollerle UTF-8 kullanılırsa, ürün ağacını kodlama formu imzası olarak kullanmaktan kaçınılmalıdır.

  4. Veri akışının kesin türü bilindiğinde (örn. Unicode big-endian veya Unicode little-endian), BOM kullanılmamalıdır. Özellikle, bir veri akışı UTF-16BE, UTF-16LE, UTF-32BE veya UTF-32LE olarak bildirildiğinde, bir Malzeme Listesi kullanılmamalıdır.


1

Gönderen http://en.wikipedia.org/wiki/Byte-order_mark :

Bayt sırası işareti (BOM), bir metin dosyasının veya akışın endianitesini (bayt sırası) belirtmek için kullanılan bir Unicode karakteridir. Kod noktası U + FEFF'dir. Malzeme Listesi kullanımı isteğe bağlıdır ve kullanılıyorsa metin akışının başında görünmelidir. Bayt sırası göstergesi olarak özel kullanımının ötesinde, Malzeme Listesi karakteri metnin çeşitli Unicode gösterimlerinden hangisinin kodlandığını da gösterebilir.

Dosyanızda her zaman bir ürün ağacı kullanmak, UTF-8 ve BOM'yi destekleyen bir düzenleyicide her zaman doğru şekilde açılmasını sağlar.

Ürün ağacının yokluğu ile ilgili gerçek sorunum şudur. Diyelim ki aşağıdakileri içeren bir dosyamız var:

abc

Malzeme Listesi olmadan bu, çoğu editörde ANSI olarak açılır. Bu dosyanın başka bir kullanıcısı dosyayı açar ve bazı yerel karakterler ekler, örneğin:

abg-αβγ

Hata! Şimdi dosya hala ANSI'da ve tahmin edin ne "αβγ" 6 bayt, ama 3 işgal etmez. Bu UTF-8 değildir ve bu daha sonra geliştirme zincirinde başka sorunlara neden olur.


9
Sahte baytların BOM farkında olmayan yazılımların başında görünmesini sağlayın. Yaşasın.
Romain

1
@Romain Muller: BOM'dan sonra üstbilgiler göndermeye çalıştığınızda PHP 5 "imkansız" hatalar atar.
Piskvor binadan ayrıldı

5
αβγ ascii değildir, ancak 8bit ascii tabanlı kodlamalarda görünebilir. Bir ürün ağacının kullanımı, utf-8'in bir faydasını, ascii ile uyumluluğunu devre dışı bırakır (saf ascii'nin kullanıldığı gecikme uygulamalarıyla çalışma yeteneği).
ctrl-alt-delor

1
Bu yanlış cevap. Önünde bir malzeme listesi olan bir dize tamamen başka bir şeydir. Orada olması gerekmiyor ve sadece her şeyi mahvediyor.
tchrist

Malzeme Listesi olmadan bu, çoğu editörde ANSI olarak açılır. Kesinlikle katılıyorum. Bu durumda, doğru Codepage ile uğraşırsanız şanslısınız, ancak Codepage dosyanın bir parçası olmadığı için bu sadece bir tahmindir. Bir malzeme.
brighty

1

İşte bana bazı sorunlar veren Visual Studio, Sourcetree ve Bitbucket çekme istekleriyle ilgili deneyimim:

Böylece bir BOM imzası ile bir çekme isteği gözden geçirirken her dosya üzerinde kırmızı bir nokta karakteri içerdiği ortaya çıkıyor (oldukça can sıkıcı olabilir).

Resim açıklamasını buraya girin

Üzerine geldiyseniz, "ufeff" gibi bir karakter gösterecektir, ancak Sourcetree'nin bu tür bytemarks göstermediği ortaya çıkıyor, bu yüzden büyük olasılıkla çekme isteklerinizle sonuçlanacaktır, 2017 şimdi yeni dosyaları kodlıyor, belki Bitbucket bunu görmezden gelmeli veya başka bir şekilde göstermelidir, daha fazla bilgi burada:

Kırmızı nokta işaretleyici BitBucket fark görünümü


-4

HTML dosyalarında UTF-8 kullanıyorsanız ve aynı sayfada Sırp Kiril, Sırp Latin, Almanca, Macarca veya egzotik bir dil kullanıyorsanız, Malzeme Listeli UTF daha iyidir.

Benim düşüncem bu (30 yıllık bilgi işlem ve bilişim endüstrisi).


1
Bunun da doğru olduğunu düşünüyorum. İlk 255 ASCII kümesinin dışındaki karakterleri kullanırsanız ve Malzeme Listesini atlarsanız, tarayıcılar bunu ISO-8859-1 olarak yorumlar ve bozuk karakterler alırsınız. Yukarıdaki cevaplar göz önüne alındığında, görünüşe göre bu bir BOM tespit etmediklerinde yanlış şey yapan tarayıcı satıcıları üzerinde. Ancak Microsoft Edge / Mozilla / Webkit / Blink'te çalışmadığınız sürece, bu uygulamaların sahip olduğu kusurlarla çalışmaktan başka seçeneğiniz yoktur.
Kasım'da asontu

UTF nedir? UTF-8? UTF-16? Başka bir şey?
Peter Mortensen
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.