बिना BOM के UTF-8 और UTF-8 के बीच क्या अंतर है ? कौनसा अच्छा है?
बिना BOM के UTF-8 और UTF-8 के बीच क्या अंतर है ? कौनसा अच्छा है?
जवाबों:
UTF-8 BOM एक पाठ स्ट्रीम ( ) की शुरुआत में बाइट्स का एक क्रम है 0xEF, 0xBB, 0xBF
जो रीडर को UTF-8 में एन्कोड किए जाने के रूप में किसी फ़ाइल का अधिक विश्वसनीय अनुमान लगाने की अनुमति देता है।
आम तौर पर, बीओएम का उपयोग एन्कोडिंग की समाप्ति को इंगित करने के लिए किया जाता है , लेकिन चूंकि एंडियननेस UTF-8 के लिए अप्रासंगिक है, इसलिए बीओएम अनावश्यक है।
यूनिकोड मानक के अनुसार , UTF-8 फ़ाइलों के लिए BOM अनुशंसित नहीं है :
2.6 एन्कोडिंग योजनाएँ
... किसी BOM के उपयोग के लिए UTF-8 की न तो आवश्यकता है और न ही अनुशंसित है, लेकिन ऐसे संदर्भों में सामना किया जा सकता है जहां UTF-8 डेटा को अन्य एन्कोडिंग रूपों से परिवर्तित किया जाता है जो BOM का उपयोग करते हैं या जहां BOM का उपयोग UTF-8 हस्ताक्षर के रूप में किया जाता है । अधिक जानकारी के लिए , खंड 16.8, विशेष में "बाइट ऑर्डर मार्क" उपधारा देखें।
अन्य उत्कृष्ट उत्तर पहले ही उत्तर दे चुके हैं:
EF BB BF
लेकिन, अतिरिक्त जानकारी के रूप में, यूटीएफ -8 के लिए बीओएम "गंध" करने का एक अच्छा तरीका हो सकता है अगर कोई स्ट्रिंग UTF-8 में एन्कोड किया गया था ... या यह किसी अन्य एन्कोडिंग में एक वैध स्ट्रिंग हो सकता है ...
उदाहरण के लिए, डेटा [EF BB BF 41 42 43] या तो हो सकता है:
तो जब यह पहली बाइट्स को देखकर किसी फ़ाइल सामग्री के एन्कोडिंग को पहचानने के लिए शांत हो सकता है, तो आपको इस पर भरोसा नहीं करना चाहिए, जैसा कि ऊपर दिए गए उदाहरण द्वारा दिखाया गया है
एनकोडिंग को जानना चाहिए, विभाजन को नहीं।
UTF-8 एन्कोडेड फ़ाइलों में BOM लगाने के साथ कम से कम तीन समस्याएं हैं।
और, जैसा कि दूसरों ने उल्लेख किया है, यह पता लगाने के लिए BOM होना न तो पर्याप्त है और न ही आवश्यक है कि कुछ UTF-8 है:
cat
आपको एक साफ परिणाम नहीं देगा , जिसका परिणाम केवल शुरुआत में बीओएम है। यदि आपका मतलब है, तो ऐसा इसलिए है क्योंकि cat
बाइट स्तर पर काम करता है, न कि व्याख्या की गई सामग्री के स्तर पर, और इसी तरह cat
से तस्वीरों के साथ काम नहीं कर सकता है, कहते हैं। फिर भी यह ज्यादा नुकसान नहीं करता है। ऐसा इसलिए है क्योंकि बीओएम एक शून्य-चौड़ाई वाले गैर-ब्रेकिंग स्पेस को एन्कोड करता है।
यहाँ BOM उपयोग के उदाहरण हैं जो वास्तव में वास्तविक समस्याओं का कारण बनते हैं और अभी तक बहुत से लोग इसके बारे में नहीं जानते हैं।
शेल स्क्रिप्ट, पर्ल स्क्रिप्ट, पायथन स्क्रिप्ट, रूबी स्क्रिप्ट, नोड्स स्क्रिप्ट्स या कोई अन्य निष्पादन योग्य जिसे एक दुभाषिया द्वारा चलाने की आवश्यकता होती है - सभी एक शेबंग लाइन से शुरू होते हैं जो उन में से एक की तरह दिखती है:
#!/bin/sh
#!/usr/bin/python
#!/usr/local/bin/perl
#!/usr/bin/env node
यह उस प्रणाली को बताता है जो ऐसी स्क्रिप्ट को लागू करते समय दुभाषिया को चलाने की आवश्यकता होती है। यदि स्क्रिप्ट UTF-8 में एन्कोडेड है, तो किसी को शुरुआत में BOM शामिल करने का प्रलोभन दिया जा सकता है। लेकिन वास्तव में "#!" वर्ण केवल वर्ण नहीं हैं। वे वास्तव में एक जादू की संख्या है जो दो ASCII वर्णों से बना होता है। यदि आप उन पात्रों के सामने कुछ कहते हैं (एक बीओएम की तरह), तो फाइल ऐसी दिखेगी जैसे उसमें एक अलग मैजिक नंबर था और जिससे समस्याएं हो सकती हैं।
विकिपीडिया, लेख देखें : शबंग, अनुभाग: मैजिक नंबर :
यूटीएफ -8 सहित विस्तारित ASCII एन्कोडिंग में शेबबैंग पात्रों को एक ही दो बाइट्स द्वारा दर्शाया जाता है, जो आमतौर पर वर्तमान यूनिक्स जैसी प्रणालियों पर स्क्रिप्ट और अन्य पाठ फ़ाइलों के लिए उपयोग किया जाता है। हालाँकि, UTF-8 फाइलें वैकल्पिक बाइट ऑर्डर मार्क (BOM) से शुरू हो सकती हैं; यदि "निष्पादित" फ़ंक्शन विशेष रूप से बाइट्स 0x23 और 0x21 का पता लगाता है, तो शेमबंग से पहले BOM (0xEF 0xBB 0xBF) की उपस्थिति स्क्रिप्ट दुभाषिया को निष्पादित होने से रोक देगी।कुछ अधिकारी इस कारण से और व्यापक अंतर और दार्शनिक चिंताओं के लिए POSIX (यूनिक्स जैसी) लिपियों में बाइट ऑर्डर मार्क का उपयोग करने के खिलाफ सलाह देते हैं। इसके अतिरिक्त, यूटीएफ -8 में एक बाइट ऑर्डर मार्क आवश्यक नहीं है, क्योंकि एन्कोडिंग में धीरज के मुद्दे नहीं हैं; यह केवल UTF-8 के रूप में एन्कोडिंग की पहचान करने के लिए कार्य करता है। [महत्व दिया]
RFC 7159, धारा 8.1 देखें :
कार्यान्वयन एक JSON पाठ की शुरुआत में एक बाइट क्रम चिह्न नहीं जोड़ना चाहिए।
न केवल यह JSON में गैरकानूनी है, वर्ण एन्कोडिंग को निर्धारित करने के लिए भी आवश्यक नहीं है क्योंकि किसी भी JSON स्ट्रीम में उपयोग किए जाने वाले वर्ण एन्कोडिंग और समाप्ति दोनों को निर्धारित करने के लिए अधिक विश्वसनीय तरीके हैं ( विवरण के लिए यह उत्तर देखें)।
न केवल यह JSON में अवैध है और इसकी आवश्यकता नहीं है , यह वास्तव में RFC 4627 में प्रस्तुत विधि का उपयोग करके एन्कोडिंग को निर्धारित करने वाले सभी सॉफ़्टवेयर को तोड़ता है :
एनआईएल बाइट के लिए पहले चार बाइट्स की जांच करते हुए, JSON की एन्कोडिंग और समाप्ति का निर्धारण:
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
अब, यदि फ़ाइल BOM से शुरू होती है तो यह इस तरह दिखाई देगी:
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
ध्यान दें कि:
कार्यान्वयन के आधार पर, उन सभी को गलत तरीके से यूटीएफ -8 के रूप में व्याख्या किया जा सकता है और फिर गलत तरीके से समझा या अमान्य यूटीएफ -8 के रूप में खारिज कर दिया जा सकता है, या बिल्कुल भी मान्यता प्राप्त नहीं है।
इसके अतिरिक्त, यदि मान्य JSON के लिए कार्यान्वयन परीक्षण जैसा कि मैं सुझाता हूं, यह उस इनपुट को भी अस्वीकार कर देगा जो वास्तव में UTF-8 के रूप में एन्कोडेड है, क्योंकि यह ASCII वर्ण <128 के साथ शुरू नहीं होता है क्योंकि यह RFC के अनुसार होना चाहिए।
JSON में BOM की आवश्यकता नहीं है, गैरकानूनी है और RFC के अनुसार सही ढंग से काम करने वाले सॉफ़्टवेयर को तोड़ता है। यह केवल तब और अभी तक इसका उपयोग न करने के लिए एक बड़प्पन होना चाहिए, हमेशा ऐसे लोग होते हैं जो BOMs, टिप्पणियों, अलग-अलग उद्धरण नियमों या विभिन्न डेटा प्रकारों का उपयोग करके JSON को तोड़ने पर जोर देते हैं। बेशक किसी को भी BOMs या किसी भी चीज़ का उपयोग करने के लिए स्वतंत्र है यदि आपको इसकी आवश्यकता है - तो बस इसे JSON न कहें।
JSON की तुलना में अन्य डेटा प्रारूपों के लिए, इस पर एक नज़र डालें कि यह वास्तव में कैसा दिखता है। यदि केवल एन्कोडिंग UTF- * हैं और पहले वर्ण में ASCII वर्ण 128 से कम होना चाहिए तो आपके पास पहले से ही आपके डेटा की एन्कोडिंग और समाप्ति दोनों को निर्धारित करने के लिए आवश्यक सभी जानकारी है। वैकल्पिक सुविधा के रूप में भी BOM को जोड़ने से यह और अधिक जटिल और त्रुटि प्रवण हो जाएगा।
JSON या स्क्रिप्ट के बाहर उपयोग के लिए, मुझे लगता है कि यहाँ पहले से ही बहुत अच्छे उत्तर हैं। मैं विशेष रूप से स्क्रिप्टिंग और क्रमांकन के बारे में अधिक विस्तृत जानकारी जोड़ना चाहता था, क्योंकि यह BOM पात्रों का एक उदाहरण है जो वास्तविक समस्याओं का कारण बनता है।
बिना BOM के UTF-8 और UTF-8 के बीच क्या अंतर है?
संक्षिप्त उत्तर: UTF-8 में, एक BOM EF BB BF
फ़ाइल के आरंभ में बाइट्स के रूप में एन्कोड किया गया है ।
लंबा जवाब:
मूल रूप से, यह उम्मीद की गई थी कि यूनिकोड को UTF-16 / UCS-2 में कूटबद्ध किया जाएगा। BOM को इस एन्कोडिंग फॉर्म के लिए डिज़ाइन किया गया था। जब आपके पास 2-बाइट कोड इकाइयां होती हैं, तो यह इंगित करना आवश्यक है कि उन दो बाइट्स किस क्रम में हैं, और ऐसा करने के लिए एक आम सम्मेलन डेटा की शुरुआत में "बाइट ऑर्डर मार्क" के रूप में चरित्र U + FEFF को शामिल करना है। U + FFFE वर्ण स्थायी रूप से अप्रमाणित है ताकि इसकी उपस्थिति का उपयोग गलत बाइट क्रम का पता लगाने के लिए किया जा सके।
यूटीएफ -8 में प्लेटफ़ॉर्म एंडियननेस की परवाह किए बिना एक ही बाइट ऑर्डर है, इसलिए एक बाइट ऑर्डर मार्क की आवश्यकता नहीं है। हालाँकि, यह हो सकता है EF BB FF
कि डेटा में (बाइट अनुक्रम के रूप में ) UTF-8 से UTF-16 में परिवर्तित कर दिया गया हो, या डेटा "UTF-8" इंगित करने के लिए "हस्ताक्षर" के रूप में हो।
कौनसा अच्छा है?
के बिना। जैसा कि मार्टिन कोटे ने उत्तर दिया, यूनिकोड मानक इसकी अनुशंसा नहीं करता है। यह गैर-बीओएम-जागरूक सॉफ्टवेयर के साथ समस्याओं का कारण बनता है।
यह पता लगाने का एक बेहतर तरीका है कि कोई फ़ाइल UTF-8 वैधता जांचने के लिए है या नहीं। यूटीएफ -8 में सख्त नियम हैं कि बाइट अनुक्रम वैध हैं, इसलिए एक झूठे सकारात्मक की संभावना नगण्य है। यदि एक बाइट अनुक्रम UTF-8 की तरह दिखता है, तो यह संभवतः है।
sh
, perl
, g++
, और कई अन्य स्वतंत्र और शक्तिशाली उपकरण। काम करने के लिए चीजें चाहिए? बस एमएस संस्करण खरीदें । MS ने अपने \ x80- \ x95 रेंज की आपदा की तरह ही प्लेटफ़ॉर्म-विशिष्ट समस्या का निर्माण किया।
BOM के साथ UTF-8 की बेहतर पहचान है। मैं इस नतीजे पर पहुंचा हूं। मैं एक ऐसी परियोजना पर काम कर रहा हूं , जिसमें एक परिणाम CSV फ़ाइल है, जिसमें यूनिकोड वर्ण शामिल हैं।
यदि CSV फ़ाइल को BOM के बिना सहेजा जाता है, तो Excel सोचता है कि यह ANSI है और यह अस्पष्ट दिखाता है। एक बार जब आप सामने से "ईएफ बीबी बीएफ" जोड़ते हैं (उदाहरण के लिए, यूटीएफ -8 के साथ नोटपैड का उपयोग करके इसे फिर से सहेजकर, या यूटीएफ -8 के साथ नोटपैड ++ बीओएम के साथ), एक्सेल इसे ठीक से खोलता है।
यूएमकोड पाठ फ़ाइलों के लिए BOM चरित्र को प्रस्तुत करने की सिफारिश RFC 3629 द्वारा की जाती है: "UTF-8, ISO 10646 का एक रूपांतरण प्रारूप", नवंबर 2003 में http://tools.ietf.org/html/rfc3629 (यह अंतिम जानकारी इस पर मिली: http://www.herongyang.com/Unicode/Notepad-Byte-Oder-Mark-BOM-FEFF-EFBBF.html )
BOM कहीं न कहीं, बूम (कोई उद्देश्य नहीं (एसआईसी)) को उछाल देता है। और जब यह फूलता है (उदाहरण के लिए, ब्राउज़र, संपादकों, आदि द्वारा पहचाना नहीं जाता है), तो यह 
दस्तावेज़ की शुरुआत में अजीब पात्रों के रूप में दिखाई देता है (उदाहरण के लिए, HTML फ़ाइल, JSON प्रतिक्रिया, RSS , आदि) और ट्विटर पर ओबामा की चर्चा के दौरान हाल ही में एन्कोडिंग मुद्दे की तरह शर्मिंदगी का कारण बनता है ।
यह बहुत कष्टप्रद होता है जब यह डिबग करने के लिए कठिन स्थानों पर दिखाई देता है या जब परीक्षण की उपेक्षा की जाती है। इसलिए इसे टालना सबसे अच्छा है जब तक आप इसका उपयोग न करें।
प्रश्न: बिना BOM के UTF-8 और UTF-8 के बीच क्या अंतर है? कौनसा अच्छा है?
यहाँ बाइट ऑर्डर मार्क (BOM) पर विकिपीडिया लेख के कुछ अंश दिए गए हैं, जो मुझे विश्वास है कि इस प्रश्न का ठोस उत्तर प्रस्तुत करते हैं।
BOM और UTF-8 के अर्थ पर:
यूनिकोड मानक यूटीएफ -8 में बीओएम की अनुमति देता है , लेकिन इसके उपयोग की आवश्यकता या अनुशंसा नहीं करता है। यूटीएफ -8 में बाइट ऑर्डर का कोई मतलब नहीं है, इसलिए यूटीएफ -8 में इसका एकमात्र उपयोग शुरू में संकेत देना है कि टेक्स्ट स्ट्रीम यूटीएफ -8 में एन्कोडेड है।
BOM का उपयोग नहीं करने के लिए तर्क :
BOM का उपयोग नहीं करने के लिए प्राथमिक प्रेरणा सॉफ्टवेयर के साथ बैकवर्ड-संगतता है जो यूनिकोड-अवगत नहीं है ... BOM का उपयोग नहीं करने के लिए एक और प्रेरणा UTF-8 को "डिफ़ॉल्ट" एन्कोडिंग के रूप में प्रोत्साहित करना है।
BOM का उपयोग करने के लिए तर्क :
BOM का उपयोग करने का तर्क यह है कि इसके बिना, यह निर्धारित करने के लिए कि किस फ़ाइल को एन्कोडिंग का उपयोग किया जाता है, हेयुरिस्टिक विश्लेषण की आवश्यकता होती है। ऐतिहासिक रूप से ऐसा विश्लेषण, विभिन्न 8-बिट एन्कोडिंग को भेद करने के लिए, जटिल, त्रुटि-प्रवण और कभी-कभी धीमा होता है। कार्य को आसान बनाने के लिए कई पुस्तकालय उपलब्ध हैं, जैसे कि मोज़िला यूनिवर्सल चार्सेट डिटेक्टर और यूनिकोड के लिए अंतर्राष्ट्रीय घटक।
प्रोग्रामर गलती से यह मान लेते हैं कि UTF-8 का पता लगाना उतना ही मुश्किल है (यह बाइट अनुक्रमों के विशाल बहुमत के कारण अमान्य UTF-8 नहीं है, जबकि इन पुस्तकालयों में एनकोडिंग सभी संभावित बाइट अनुक्रमों को अलग करने की कोशिश कर रहे हैं)। इसलिए सभी यूनिकोड-जागरूक कार्यक्रम इस तरह का विश्लेषण नहीं करते हैं और इसके बजाय बीओएम पर भरोसा करते हैं।
विशेष रूप से, Microsoft कंपाइलर्स और दुभाषिए, और Microsoft Windows पर सॉफ़्टवेयर के कई टुकड़े जैसे कि नोटपैड ने सही ढंग से UTF-8 पाठ नहीं पढ़ा होगा जब तक कि इसमें केवल ASCII वर्ण नहीं है या यह BOM से शुरू होता है, और बचत करते समय प्रारंभ में BOM जोड़ देगा UTF-8 के रूप में पाठ। जब Microsoft Word दस्तावेज़ को एक सादे पाठ फ़ाइल के रूप में डाउनलोड किया जाता है, तो Google डॉक्स एक BOM जोड़ देगा।
जो पर, बेहतर है के साथ या बिना बीओएम:
IETF सिफारिश की है कि UTF-8, या (ख) से संकेत मिलता है क्या एन्कोडिंग का प्रयोग किया जा रहा है किसी और तरीके से, तो यह है कि अगर एक प्रोटोकॉल या तो (क) हमेशा उपयोग करता है "चाहिए एक हस्ताक्षर के रूप में U + FEFF के प्रयोग की मनाही।"
मेरा निष्कर्ष:
BOM का उपयोग केवल तभी करें जब सॉफ़्टवेयर एप्लिकेशन के साथ संगतता बिल्कुल आवश्यक हो।
यह भी ध्यान दें कि जबकि संदर्भित विकिपीडिया लेख इंगित करता है कि कई Microsoft अनुप्रयोग BOM पर सही ढंग से UTF-8 का पता लगाने के लिए भरोसा करते हैं, यह सभी Microsoft अनुप्रयोगों के लिए ऐसा नहीं है । उदाहरण के लिए, द्वारा उठाई बाहर के रूप में @barlop , जब विंडोज कमांड प्रॉम्प्ट का उपयोग कर UTF-8 के साथ † , इस तरह के आदेशों type
और more
उम्मीद नहीं है बीओएम उपस्थित होना। अगर बीओएम है वर्तमान में, यह समस्या हो सकती है के रूप में यह अन्य अनुप्रयोगों के लिए है।
Without chcp
कमांड कोड पृष्ठ 65001 के माध्यम से UTF-8 ( BOM के बिना ) के लिए समर्थन प्रदान करता है ।
.htaccess
और gzip compression
UTF-8 बीओएम के साथ संयोजन में एक एन्कोडिंग त्रुटि बदलें किसी सुझाव का बिना बीओएम पालन UTF-8 में एन्कोडिंग के लिए देता है के रूप में समझाया यहां की समस्याओं को हल
इस प्रश्न के पहले से ही एक लाख और एक उत्तर हैं और उनमें से कई काफी अच्छे हैं, लेकिन मैं कोशिश करना चाहता था और स्पष्ट करना चाहता हूं कि एक बीओएम का उपयोग किया जाना चाहिए या नहीं।
जैसा कि उल्लेख किया गया है, यह निर्धारित करने के लिए कि क्या एक स्ट्रिंग UTF-8 है या नहीं, यह निर्धारित करने में UTF BOM (बाइट ऑर्डर मार्क) का कोई उपयोग शिक्षित अनुमान नहीं है। यदि उचित मेटाडेटा उपलब्ध है (जैसे charset="utf-8"
), तो आप पहले से ही जानते हैं कि आप क्या उपयोग करने वाले हैं, लेकिन अन्यथा आपको कुछ मान्यताओं का परीक्षण करने और बनाने की आवश्यकता होगी। इसमें हेक्साडेसिमल बाइट कोड, ईएफ बीबी बीएफ के साथ शुरू होने वाली फ़ाइल की जाँच करना शामिल है।
यदि यूटीएफ -8 बीओएम के अनुरूप बाइट कोड पाया जाता है, तो संभावना यह है कि यह यूटीएफ -8 है और आप वहां से जा सकते हैं। जब यह अनुमान लगाने के लिए मजबूर किया जाता है, हालांकि, पढ़ने के दौरान अतिरिक्त त्रुटि की जाँच अभी भी एक अच्छा विचार होगा जब कुछ गड़बड़ हो जाएगा। यदि इनपुट निश्चित रूप से इसके स्रोत के आधार पर UTF-8 नहीं होना चाहिए , तो आपको केवल यह मान लेना चाहिए कि BOM UTF-8 (यानी लैटिन -1 या ANSI) नहीं है । अगर कोई बीओएम नहीं है, तो आप बस यह निर्धारित कर सकते हैं कि एन्कोडिंग के खिलाफ सत्यापन करके यह यूटीएफ -8 माना जाता है या नहीं।
यदि आप मेटाडेटा को किसी अन्य तरीके से (चारसेट टैग या फ़ाइल सिस्टम मेटा के माध्यम से) रिकॉर्ड करने में असमर्थ हैं, और बीओएम जैसे कार्यक्रमों का उपयोग किया जा रहा है, तो आपको बीओएम के साथ एनकोड करना चाहिए। यह विंडोज पर विशेष रूप से सच है जहां एक बीओएम के बिना कुछ भी आमतौर पर विरासत कोड पृष्ठ का उपयोग करने के लिए माना जाता है। बीओएम कार्यालय जैसे कार्यक्रमों को बताता है कि, हां, इस फाइल का पाठ यूनिकोड है; यहाँ एन्कोडिंग का उपयोग किया गया है।
जब यह इसके नीचे आता है, तो केवल फाइलें जो मुझे वास्तव में सीएसवी के साथ समस्या हैं। कार्यक्रम के आधार पर, यह या तो बीओएम होना चाहिए या नहीं होना चाहिए। उदाहरण के लिए, यदि आप Windows पर Excel 2007+ का उपयोग कर रहे हैं, तो इसे BOM के साथ एन्कोड किया जाना चाहिए यदि आप इसे आसानी से खोलना चाहते हैं और डेटा आयात करने का सहारा नहीं लेना है।
यह ध्यान दिया जाना चाहिए कि कुछ फ़ाइलों के लिए आप पास विंडोज पर भी बीओएम नहीं होना चाहिए । उदाहरण SQL*plus
या VBScript
फाइलें हैं। यदि ऐसी फ़ाइलों में BOM होती है, तो जब आप उन्हें निष्पादित करने का प्रयास करते हैं तो आपको एक त्रुटि मिलती है।
BOM के साथ UTF-8 केवल तभी मदद करता है जब फ़ाइल में वास्तव में कुछ गैर-ASCII वर्ण हों। यदि यह शामिल है और कोई भी नहीं है, तो यह संभवतः पुराने अनुप्रयोगों को तोड़ देगा जिन्होंने अन्यथा फ़ाइल को सादे ASCII के रूप में व्याख्या की होगी। जब वे गैर ASCII वर्ण में आते हैं, तो ये अनुप्रयोग निश्चित रूप से विफल हो जाएंगे, इसलिए मेरी राय में BOM को केवल तभी जोड़ा जा सकता है जब फ़ाइल कर सकते हैं, और चाहिए, अब सादे ASCII के रूप में व्याख्या नहीं की जानी चाहिए।
मैं यह स्पष्ट करना चाहता हूं कि मुझे BOM बिल्कुल नहीं पसंद है। इसे जोड़ दें यदि कुछ पुरानी बकवास इसके बिना टूट जाती है, और उस विरासत की जगह आवेदन संभव नहीं है।
UTF-8 के लिए BOM से कुछ भी उम्मीद न करें।
BOM पर विकिपीडिया पृष्ठ के निचले भाग पर उद्धृत: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2
"UTM-8 के लिए BOM का उपयोग न तो आवश्यक है और न ही अनुशंसित है, लेकिन ऐसे संदर्भों में सामना किया जा सकता है जहां UTF-8 डेटा को अन्य एन्कोडिंग रूपों से परिवर्तित किया जाता है जो BOM का उपयोग करते हैं या जहां BOM का उपयोग UTF-8 हस्ताक्षर के रूप में किया जाता है"
बिना BOM के UTF-8 में कोई BOM नहीं है, जो इसे किसी भी तरह से UTF-8 से बेहतर नहीं बनाता है, सिवाय इसके कि फ़ाइल के उपभोक्ता को पता होना चाहिए (या जानने से लाभ होगा) कि क्या फ़ाइल UTF-8 है-इनकोडिंग या नहीं।
बीओएम आमतौर पर एन्कोडिंग की समाप्ति को निर्धारित करने के लिए उपयोगी होता है, जो अधिकांश उपयोग के मामलों के लिए आवश्यक नहीं होता है।
इसके अलावा, बीओएम उन उपभोक्ताओं के लिए अनावश्यक शोर / दर्द हो सकता है जो इसके बारे में नहीं जानते या परवाह नहीं करते हैं, और इसके परिणामस्वरूप उपयोगकर्ता भ्रम हो सकता है।
मैं इसे अलग नजरिए से देखता हूं। मुझे लगता है कि BOM के साथ UTF-8 बेहतर है क्योंकि यह फ़ाइल के बारे में अधिक जानकारी प्रदान करता है। मैं बिना समस्या के ही BOM के बिना UTF-8 का उपयोग करता हूं।
मैं लंबे समय से अपने पृष्ठों पर कई भाषाओं (यहां तक कि सिरिलिक ) का उपयोग कर रहा हूं और जब फ़ाइलों को बीओएम के बिना सहेजा जाता है और मैं उन्हें संपादक के साथ संपादन के लिए फिर से खोल देता हूं (जैसा कि चेरोविम ने भी उल्लेख किया है), कुछ वर्ण दूषित हैं।
ध्यान दें कि जब आप UTF-8 एन्कोडिंग के साथ एक नई बनाई गई फ़ाइल को सहेजने का प्रयास करते हैं, तो विंडोज का क्लासिक नोटपैड स्वचालित रूप से एक बीओएम के साथ फाइलों को बचाता है।
मैं व्यक्तिगत रूप से सर्वर साइड स्क्रिप्टिंग फ़ाइलों (.asp, .ini, .aspx) को BOM और .html फाइलों को बिना BOM के सहेजता हूं ।
chcp 65001
utf8 समर्थन के लिए कमांड चलाते हैं , यह बिना बम के utf8 है। यदि आप ऐसा करते हैं तो type myfile
यह केवल ठीक से प्रदर्शित होगा यदि कोई बम नहीं है। यदि आप एए फाइल करने के लिए चार्ट का उत्पादन करते हैं echo aaa>a.a
या करते हैं echo אאא>a.a
, और आपके पास 65001 chcp है, तो यह बिना BOM के आउटपुट देगा।
जब आप UTF-8 में एन्कोडेड जानकारी प्रदर्शित करना चाहते हैं तो आपको समस्याओं का सामना नहीं करना पड़ सकता है। उदाहरण के लिए HTML दस्तावेज़ को UTF-8 के रूप में घोषित करें और आपके पास आपके ब्राउज़र में वह सब कुछ होगा जो दस्तावेज़ के मुख्य भाग में समाहित है।
लेकिन यह तब नहीं होता जब हमारे पास पाठ, सीएसवी और एक्सएमएल फाइलें हों, या तो विंडोज या लिनक्स पर।
उदाहरण के लिए, विंडोज या लिनक्स में एक पाठ फ़ाइल, सबसे आसान चीजों में से एक, यह कल्पना नहीं है (आमतौर पर) यूटीएफ -8।
इसे XML के रूप में सहेजें और इसे UTF-8 घोषित करें:
<?xml version="1.0" encoding="UTF-8"?>
यह सही ढंग से प्रदर्शित नहीं होगा (यह पढ़ा नहीं जाएगा) भले ही इसे यूटीएफ -8 घोषित किया गया हो।
मेरे पास फ्रांसीसी अक्षरों वाले डेटा की एक स्ट्रिंग थी, जिसे सिंडिकेशन के लिए XML के रूप में सहेजने की आवश्यकता थी। बहुत शुरुआत से एक यूटीएफ -8 फ़ाइल बनाने के बिना (आईडीई और "नई फ़ाइल बनाएं" में विकल्प बदलते हुए) या फ़ाइल की शुरुआत में बीओएम को जोड़ना
$file="\xEF\xBB\xBF".$string;
मैं एक XML फ़ाइल में फ्रेंच अक्षरों को सहेजने में सक्षम नहीं था।
एक व्यावहारिक अंतर यह है कि यदि आप Mac OS X के लिए शेल स्क्रिप्ट लिखते हैं और इसे सादे UTF-8 के रूप में सहेजते हैं, तो आपको प्रतिक्रिया मिलेगी:
#!/bin/bash: No such file or directory
शेबंग लाइन के जवाब में निर्दिष्ट करें कि आप किस शेल का उपयोग करना चाहते हैं:
#!/bin/bash
यदि आप UTF-8 के रूप में सहेजते हैं, तो कोई BOM ( BBEdit में नहीं ) सब ठीक हो जाएगा।
जैसा कि ऊपर उल्लेख किया गया है, बीओएम के साथ यूटीएफ -8 गैर-बीओएम-जागरूक (या संगत) सॉफ़्टवेयर के साथ समस्याएं पैदा कर सकता है। मैंने एक बार HTML फ़ाइलों को संपादित किया जो UTF-8 + BOM के रूप में मोज़िला-आधारित कोम्पोज़र के साथ एन्कोड किया गया , एक क्लाइंट के रूप में जिसे WYSIWYG प्रोग्राम की आवश्यकता थी ।
बचत करते समय संभवतः लेआउट नष्ट हो जाएगा। इस तरह से मुझे अपना रास्ता बनाने में थोड़ा समय लगा। इन फ़ाइलों ने फिर फ़ायरफ़ॉक्स में अच्छा काम किया, लेकिन इंटरनेट एक्सप्लोरर में लेआउट को नष्ट करने वाले सीएसएस क्विक को फिर से दिखाया। घंटों तक बिना किसी लिंक के सीएसएस फाइलों के साथ काम करने के बाद मुझे पता चला कि इंटरनेट एक्सप्लोरर को BOMfed HTML फ़ाइल पसंद नहीं है। फिर कभी नहीं।
इसके अलावा, मुझे यह विकिपीडिया में मिला:
यूटीएफ -8 सहित विस्तारित ASCII एन्कोडिंग में शेबबैंग पात्रों को एक ही दो बाइट्स द्वारा दर्शाया जाता है, जो आमतौर पर वर्तमान यूनिक्स जैसी प्रणालियों पर स्क्रिप्ट और अन्य पाठ फ़ाइलों के लिए उपयोग किया जाता है। हालाँकि, UTF-8 फाइलें वैकल्पिक बाइट ऑर्डर मार्क (BOM) से शुरू हो सकती हैं; यदि "निष्पादित" फ़ंक्शन विशेष रूप से बाइट्स 0x23 0x21 का पता लगाता है, तो शेमबंग से पहले BOM (0xEF 0xBB 0xBF) की उपस्थिति स्क्रिप्ट दुभाषिया को निष्पादित होने से रोक देगी। कुछ अधिकारी इस कारण और व्यापक अंतर और दार्शनिक चिंताओं के लिए POSIX (यूनिक्स जैसी) लिपियों में बाइट ऑर्डर मार्क का उपयोग करने की सलाह देते हैं।
यूनिकोड बाइट ऑर्डर मार्क (BOM) FAQ एक संक्षिप्त उत्तर प्रदान करता है:
प्रश्न: मुझे BOM से कैसे निपटना चाहिए?
A: यहां कुछ दिशानिर्देशों का पालन किया गया है:
एक विशेष प्रोटोकॉल (जैसे .txt फ़ाइलों के लिए Microsoft कन्वेंशन) को कुछ यूनिकोड डेटा धाराओं जैसे फ़ाइलों पर BOM के उपयोग की आवश्यकता हो सकती है। जब आपको इस तरह के प्रोटोकॉल के अनुरूप होना चाहिए, तो BOM का उपयोग करें।
कुछ प्रोटोकॉल असंगत पाठ के मामले में वैकल्पिक BOMs की अनुमति देते हैं। उन मामलों में,
जहां एक पाठ डेटा स्ट्रीम को सादे पाठ के रूप में जाना जाता है, लेकिन अज्ञात एन्कोडिंग के रूप में, BOM को एक हस्ताक्षर के रूप में इस्तेमाल किया जा सकता है। यदि कोई BOM नहीं है, तो एन्कोडिंग कुछ भी हो सकता है।
जहां एक पाठ डेटा स्ट्रीम को सादे यूनिकोड पाठ (लेकिन जो एंडियन नहीं है) के रूप में जाना जाता है, तो BOM को एक हस्ताक्षर के रूप में उपयोग किया जा सकता है। यदि कोई बीओएम नहीं है, तो पाठ की व्याख्या बड़े-एंडियन के रूप में की जानी चाहिए।
कुछ बाइट ओरिएंटेड प्रोटोकॉल एक फ़ाइल की शुरुआत में ASCII वर्णों की अपेक्षा करते हैं। यदि इन प्रोटोकॉल के साथ UTF-8 का उपयोग किया जाता है, तो BOM का उपयोग एन्कोडिंग फॉर्म हस्ताक्षर के रूप में किया जाना चाहिए।
जहाँ डेटा स्ट्रीम का सटीक प्रकार ज्ञात है (जैसे यूनिकोड बिग-एंडियन या यूनिकोड लिटिल-एंडियन), BOM का उपयोग नहीं किया जाना चाहिए। विशेष रूप से, जब भी कोई डेटा स्ट्रीम UTF-16BE, UTF-16LE, UTF-32BE या UTF-32LE एक BOM का उपयोग नहीं किया जाना चाहिए।
से http://en.wikipedia.org/wiki/Byte-order_mark :
बाइट ऑर्डर मार्क (BOM) एक यूनिकोड वर्ण है जिसका उपयोग टेक्स्ट फाइल या स्ट्रीम के एंडियननेस (बाइट ऑर्डर) को इंगित करने के लिए किया जाता है। इसका कोड बिंदु U + FEFF है। BOM का उपयोग वैकल्पिक है, और, यदि उपयोग किया जाता है, तो पाठ स्ट्रीम की शुरुआत में दिखाई देना चाहिए। बाइट-ऑर्डर इंडिकेटर के रूप में इसके विशिष्ट उपयोग से परे, बीओएम चरित्र यह भी संकेत दे सकता है कि पाठ में कई यूनिकोड निरूपण में से कौन सा इनकोडिंग है।
हमेशा अपनी फ़ाइल में BOM का उपयोग करना सुनिश्चित करेगा कि यह हमेशा एक संपादक में सही ढंग से खुलता है जो UTF-8 और BOM का समर्थन करता है।
BOM की अनुपस्थिति के साथ मेरी वास्तविक समस्या निम्नलिखित है। मान लीजिए कि हमें एक फ़ाइल मिली है जिसमें शामिल हैं:
abc
BOM के बिना यह अधिकांश संपादकों में ANSI के रूप में खुलता है। इसलिए इस फ़ाइल का एक अन्य उपयोगकर्ता इसे खोलता है और उदाहरण के लिए कुछ मूल वर्ण जोड़ता है:
abg-αβγ
उफ़ ... अब फ़ाइल अभी भी ANSI में है और लगता है कि क्या, "α does" 6 बाइट्स पर कब्जा नहीं करता है, लेकिन 3. यह UTF-8 नहीं है और यह बाद में विकास श्रृंखला में अन्य समस्याओं का कारण बनता है।
यहाँ विजुअल स्टूडियो, सॉरीकेट्री और बिटबकेट पुल अनुरोधों के साथ मेरा अनुभव है , जो मुझे कुछ समस्याएं दे रहा है:
तो यह पता चला है कि BOM एक हस्ताक्षर के साथ एक लाल डॉट वर्ण शामिल करेगा जब एक पुल अनुरोध की समीक्षा (यह काफी कष्टप्रद हो सकता है)।
यदि आप इस पर मंडराते हैं, तो यह "ufeff" जैसे चरित्र को दिखाएगा, लेकिन यह पता चलता है कि Sourcetree इस प्रकार के बाइटमार्क नहीं दिखाता है, इसलिए यह संभवतः आपके पुल अनुरोधों में समाप्त हो जाएगा, जो ठीक होना चाहिए, यह है कि विज़ुअल स्टूडियो 2017 ने अब नई फ़ाइलों को एन्कोड किया है, इसलिए शायद बिटबकेट को इसे अनदेखा करना चाहिए या इसे दूसरे तरीके से दिखाना चाहिए, यहां अधिक जानकारी:
अगर आप HTML फ़ाइलों में UTF-8 का उपयोग करते हैं और यदि आप उसी पृष्ठ पर सर्बियाई सिरिलिक, सर्बियाई लैटिन, जर्मन, हंगेरियन या कुछ विदेशी भाषा का उपयोग करते हैं तो BOM वाला UTF बेहतर है।
यह मेरी राय है (कंप्यूटिंग और आईटी उद्योग के 30 साल)।