In Unicode , bayt düzenin göstergesi (İngilizce veya BOM sırası işareti bayt ), genellikle bazı dosyalar metnin başında Unicode kodlama ve bayt sırası kullanımını gösterir verileri olduğunu.
Teknik olarak, bu karakter bir UCS / Unicode karakter dizesinin sonluluğunu işaretlemek için kullanıldığında, U + FEFF kod noktasına sahip bir Unicode karakteridir ( genişliği olmayan bölünmeyen boşluk veya İngilizce sıfır genişlikli bölünmesiz boşluk ) UTF-16 veya UTF-32 ile kodlanmıştır ve / veya metnin UTF-8 , UTF-16 veya UTF-32 olarak kodlandığını belirtmek için bir işaretçi olarak kodlanmıştır . Unicode'un ISO karşılığı olan ISO / IEC 10646'nın Fransızca sürümündeki resmi terim, bu karakter için bir sekizli sıra göstergesidir (IOO).
Doğru yorumlandığında, IOO, kodlanan metnin son kullanıcısı tarafından görülmez. Ancak, bu karakterin yanlış yorumlanabileceği iki durum vardır:
Çoğu Unicode kodlamasının bayt sırası göstergesi , metni okumak için kullanılan yazılım yanlış yapılandırılırsa belirsiz bir karakter dizisi olarak veya metni okumak için kullanılan yazılımsa boşluk olarak görünebilen birkaç bayt dizisidir. bu göstergeyi tanımıyorum.
Bir bayt sırası göstergesi yanlış bir şekilde metnin içinde bir karakter olarak yorumlanırsa, satır aralığı olmayan (yani sıfır genişlik) bölünmeyen bir boşluk olması nedeniyle görünmez olacaktır. U + FEFF karakterinin bölünmesiz bir aralıksız boşluk, yani gluon kelimesi olarak kullanılması, bu kullanım için bir U + 2060 alternatifi sağlayan Unicode sürüm 3.2'de kullanımdan kaldırılmıştır. Bu nedenle bu karakter yalnızca bayt sırası göstergesi olarak kullanılmalıdır.
2001 yılında, 4508058 hatası Java'da "UTF-8 kodlaması ilk BOM'u tanımıyor" olarak tanımlandı. Düzeltmemeye karar verildi. 2006/2007 civarında düzeltildi.
İçinde Kasım 2003, BOM sorunu RFC 3629 tarafından değerlendirilir.
Arasında Haziran 2001ve 2009'da, bayt sırası göstergesi sorunu PEP 263 "Python Kaynak Kod Kodlamalarını Tanımlama" (PEP , Python geliştirme önerisi , yani Python iyileştirme önerisi anlamına gelir) aracılığıyla Python dilinde dikkate alındı .
Önce 25 Ocak 2005Microsoft, not defteri yazılımında, kendisi için hazırlanmamış bazı eski Unix yazılımlarıyla birlikte çalışabilirliği bozan bir Unicode uyumluluk özelliği getirmiştir.
İçinde Temmuz 2005Bomstrip adlı bir araç , kullanıcılara, ürün reçetesi göstergesinin kullanımını tanıtan yeni yazılım ile onu beklemeyen eski yazılımlar arasındaki uyumsuzlukların üstesinden gelmek için duruma göre bir yol sağlamak üzere geliştirilmiştir.
İçinde Ağustos 2005, BOM'un shebang ile birlikte kullanımına izin vermek için Linux çekirdeği için bir yama önerilmiştir .
İçinde Ekim 2005Visual Studio 2005, derleyici ve bağlayıcıda BOM ile Unicode kaynaklarını destekler.
İçinde Şubat 2007, Apache web sunucusunun yapılandırma dosyalarını işleme biçiminde bir hata keşfedilir.
8 Nisan 2007UTF-8 kullanımı için önceden yapılandırılmış Debian'ın Etch sürümünün, yani 4.0 sürümünün yayınlanması gerçekleşir. daha sonra önceki kodlamaların geçerliliğini yitirdiği duyurulur.
İçinde Nisan 2007, bayt sırası göstergesinin kabul edilmemesiyle ilgili bir hata tespit edilir ve GCC Fortran derleyicisinde derhal düzeltilir.
İçinde Eylül 2007GCC derleyicisinde Nisan 2008'de bayt sırası göstergesinin kabul edilmemesiyle ilgili bir hata tespit edildi ve düzeltildi.
İçinde Mayıs 2008, CSV dosyalarının OpenOffice tarafından içe aktarılmasında benzer bir hata tespit edildi, Nisan 2011, dev300_m101 adı altında.
Unicode 6.1 sürümünde, Ocak 2012, bu bilgiler geçerliliğini korur ve “16.8 Özel Ürünler” bölümünde belgelenmiştir.
In UTF-16 , bayt sırası göstergesi müteakip kodlanmış karakterler big-endian sırada kullanmasını belirtmek için, kodlanmış dize başlangıcında iki bayt dizisi FE FF ile temsil edilir; veya dizi FF FE ise küçük-endian sırasını belirtmek için. Unicode standardı, U + FFFE kod noktasının herhangi bir Unicode karakteriyle ilişkili olmadığını garanti ettiğinden ve bir karakter olan U + FEFF'nin aksine, bu iki baytlık dizi baytların sırasını belirlemek için yeterlidir.
Aynı prensibe göre bayt sırası göstergesi UTF-32'de kullanılabilir .
UTF-8 karakter kodlaması bir bayt sırası sorunu oluşturmazken, bayt sırası bayrağı bazen metnin UTF-8 olarak kodlanmış olduğunu belirlemek için kullanılır. Aslında, birlikte çalışabilirlik adına , bazı sistemler, ISO / IEC 8859-1 gibi eski bir karakter kodlaması olan UTF-8'e ek olarak desteklemektedir . Bu durumda bayrak, UTF-8 metninin başında eski karakter kodlamasını kullanarak onu metinden ayırmak için kullanılabilir.
Bu teknik, UTF-8'deki bayt sırası göstergesine karşılık gelen bayt dizisinin, eski karakter kodlamasında kodlanmış metinde çok düşük bir olasılığa sahip olduğu varsayımına dayanmaktadır. Bu özellikle ISO 8859-1'deki durumdur. Aslında, UTF-8'de bayt sırası göstergesi, ISO 8859-1'de “ï” ¿”metnine karşılık gelen EF BB BF dizisi tarafından kodlanır.
Bu yöntem, UTF-8'den hızlı ve kesin bir ayrıma izin verse de, tüm yazılımlar tarafından tanınmaz ve bu nedenle uyumluluk sorunları ortaya çıkarır. Unicode konsorsiyumu, bayt sırası göstergesinin bu kullanımını açıkça tanımlamaktadır, ancak kullanımını yasaklamayı veya önermeyi amaçlayan güçlü bir konum benimsememiştir. Bu kararsızlık, şüphesiz, göstergeyi özellikle Windows altında yoğun bir şekilde kullanan yazılım ile geliştiricilerin kullanımının, özellikle belirli Unix altında, bununla ilgilenmek için yeterince marjinal olduğunu düşündüğü yazılım arasındaki birlikte çalışabilirlik sorunlarını körükledi. .
Örneğin, bayt sırası göstergesini takip ederken U + 233B4 kod noktasına sahip Unicode karakteri (Çince karakter "bir ağacın kütüğü" anlamına gelir) aşağıdaki bayt dizisi ile kodlanır:
EF BB BF | F0 A3 8E B4 | ... |
Bazı eski Unix tabanlı yazılımlar, genişletilmiş ASCII ile çalışmak üzere geliştirilmiştir. Genişletilmiş ASCII kavramı, ASCII olmayan baytlarda nispeten uyumlu ve şeffaf olurken, yazılımın ASCII aralığında çalışmasını düzeltir. Bu nedenle, UTF-8 dosyalarını işlemek için tasarlanmadan, bayt sırası göstergesi tökezleyen bir blok olmasına rağmen, bu programlar UTF-8 ile nispeten uyumludur. Aslında, kavramsal bir bakış açısından, UTF-8 bayt sıra göstergesini kabul etmek, UTF-8 standardına diğer karakter kodlamalarına göre daha fazla önem vermek anlamına gelir, bu da yönlendirilmiş mantığa aykırıdır. Bayt ve şu tarihe kadar geçerli olan çoklu kodlama sonra. Linux dağıtımlarından bazı yazılımlar yine de uyarlanmıştır.
2005 yılından bu yana, bu yaklaşım birçok Windows yazılımının (Windows Not Defteri dahil ) ve Visual Studio / .NET ortamının UTF-8 dosyalarına bir bayt sırası göstergesi eklediği gerçeğiyle karşı karşıya kalmıştır .
Unix benzeri sistemlerdeki ( yapılandırma için çok metin dosyaları kullanan) yazılımlarda bu uygulama önerilmez.
Kendi başlarına kaldıramayan uyumsuz yazılımlar için UTF-8 bayt sırası işaretini manuel olarak kaldırmak gerektiğinde bile kullanımdan kaldırılabilir. Bu, özellikle yorumlanmış bir komut dosyasının başlangıcında shebang kullanan komut dosyaları için geçerlidir . Derleyicileri tanımadığında programlama dillerinin sözcüksel analizine de müdahale edebilir . Örneğin, GCC kaynak dosyanın başlangıcında başıboş karakterleri belirtir ve PHP 5'te çıktı arabelleği devre dışı bırakılırsa, bu, sayfanın tarayıcıya gönderildiği anda başlamasına ve değiştirilmesini önleme gibi ince bir etkiye sahiptir. PHP betiği tarafından HTTP başlıkları.
Gelen metin editörü ve tarayıcılar içinde sap UTF-8'e kötü hazırlanmış ISO-8859-1 kodlama , bayrak "i" ¿" olarak görünür.
Ayrıca bir CSS sayfasının ilk kuralını uygulamada başarısız olabilirler veya belirli PHP5 işlevlerinin (örneğin simplexml_load_file ()) kullanımının başarısız olmasına neden olabilirler.
Bayt sırası bayrağını kullanmama ile ilgili sorunlarBayt sırası bayrağı kullanılmadığında, bir metin düzenleyici UTF-8 biçimini tanıyamayabilir, metni UTF-8 biçiminin dışında değiştirebilir ve ardından UTF-8'in otomatik algılamasını devre dışı bırakabilir.
BOM'a alternatifler, UTF-8'in otomatik olarak algılanması olabilir ve bu, çoğu durumda nadir hatalarla bir dosya üzerinde istatistiksel olarak çalışması gerekir. Bununla birlikte, bu teknik herhangi bir akış üzerinde güvenilir bir şekilde çalışamaz çünkü tedaviye başlamadan önce tüm akışın alınmasını gerektirecektir. Bu alternatif, bazıları UTF-8'de bozuk olan veya olmayan bir metin toplamı içeren bir dosyada da başarısız olur.
Unicode Standardı SSS BOM kullanımının soruya dört cevap verir:
Apple , programcılar için bir Unicode metin dosyasıyla uğraşırken bir uygulamanın nasıl davrandığına dair bir dizi kılavuz yayınladı. Bu direktifler onlara şunları öngörür:
Kodlama | Bayt dizisi (Temsil) |
---|---|
UTF-8 | EF BB BF |
UTF-16 Büyük Endian | FE FF |
UTF-16 Küçük Endian | FF FE |
UTF-32 Büyük Endian | 00 00 FE FF |
UTF-32 Küçük Endian | FF FE 00 00 |
SCSU | 0E FE FF |
UTF-7 |
2B 2F 76 ve bir aşağıdaki bayt dizileri: [38 | 39 | 2B | 2 F] |
UTF-EBCDIC | DD 73 66 73 |
BOCU -1 | FB EE 28 |
UTF-1 | F7 64 4C |
Unicode standardı , bir Unicode veri akışının başlangıcında bayt sırası göstergesini empoze etmez, ancak buna izin verir; bu özellikle bayrağın isteğe bağlı olduğu UTF-8 için geçerlidir.
Kabul edilebilirliği, kullanılan protokollere bağlıdır. Birlikte çalışabilirlik amacıyla, yazılım mevcut olduğunda onu tanıma eğilimindedir ve kullanıcılar, yazılım tarafından tanınmadığında onu kaldırma eğilimindedir.
P. Andries, Uygulamada Unicode 5.0 , Paris, Dunod, 2008.