unicode - बीओएम के बिना यूटीएफ-8 और यूटीएफ-8 के बीच क्या अंतर है?




utf-8 character-encoding (14)

BOM बिना यूटीएफ -8 और यूटीएफ -8 के बीच क्या अंतर है? कौनसा अच्छा है?


बीओएम के बिना यूटीएफ -8 और यूटीएफ -8 के बीच क्या अंतर है?

संक्षिप्त उत्तर: यूटीएफ -8 में, एक बीओएम फ़ाइल की शुरुआत में बाइट्स EF BB BF रूप में एन्कोड किया गया है।

लंबा जवाब:

मूल रूप से, यह उम्मीद की गई थी कि यूटीएफ -16 / यूसीएस -2 में Unicode एन्कोड किया जाएगा। बीओएम को इस एन्कोडिंग फॉर्म के लिए डिज़ाइन किया गया था। जब आपके पास 2-बाइट कोड इकाइयां हों, तो यह इंगित करना आवश्यक है कि उन दो बाइट्स किस क्रम में हैं, और ऐसा करने के लिए एक आम सम्मेलन डेटा की शुरुआत में "बाइट ऑर्डर मार्क" के रूप में वर्ण यू + एफईएफएफ को शामिल करना है। चरित्र यू + एफएफएफई को स्थायी रूप से असाइन किया गया है ताकि गलत उपस्थिति का पता लगाने के लिए इसकी उपस्थिति का उपयोग किया जा सके।

प्लेटफार्म अंतहीनता के बावजूद यूटीएफ -8 में एक ही बाइट ऑर्डर है, इसलिए बाइट ऑर्डर मार्क की आवश्यकता नहीं है। हालांकि, यह डेटा में (बाइट अनुक्रम EF BB FF ) हो सकता है जिसे यूटीएफ -8 में यूटीएफ -8 में परिवर्तित किया गया था, या "हस्ताक्षर" के रूप में यह इंगित करने के लिए कि डेटा यूटीएफ -8 है।

कौनसा अच्छा है?

के बग़ैर। जैसा कि मार्टिन कोटे ने उत्तर दिया, यूनिकोड मानक इसकी अनुशंसा नहीं करता है। यह गैर-बीओएम-जागरूक सॉफ्टवेयर के साथ समस्याएं पैदा करता है।

यह पहचानने का एक बेहतर तरीका है कि फ़ाइल यूटीएफ -8 वैधता जांच करने के लिए है या नहीं। यूटीएफ -8 में सख्त नियम हैं कि बाइट अनुक्रम मान्य हैं, इसलिए झूठी सकारात्मक की संभावना नगण्य है। यदि एक बाइट अनुक्रम यूटीएफ -8 की तरह दिखता है, तो शायद यह है।


प्रश्न: बीओएम के बिना यूटीएफ -8 और यूटीएफ -8 के बीच क्या अंतर है? कौनसा अच्छा है?

यहां बाइट ऑर्डर मार्क (बीओएम) पर विकिपीडिया लेख से कुछ अंश दिए गए हैं, जो मुझे विश्वास है कि इस प्रश्न का ठोस जवाब प्रदान करते हैं।

बीओएम और यूटीएफ -8 के अर्थ पर:

यूनिकोड मानक बीओएम को यूटीएफ -8 में अनुमति देता है, लेकिन इसके उपयोग की आवश्यकता या अनुशंसा नहीं करता है। यूटीएफ -8 में बाइट ऑर्डर का कोई मतलब नहीं है, इसलिए यूटीएफ -8 में इसका एकमात्र उपयोग शुरुआत में संकेत देना है कि टेक्स्ट स्ट्रीम यूटीएफ -8 में एन्कोड किया गया है।

बीओएम का उपयोग करने के लिए तर्क :

बीओएम का उपयोग न करने के लिए प्राथमिक प्रेरणा सॉफ्टवेयर के साथ पिछड़ा-संगतता है जो यूनिकोड-जागरूक नहीं है ... बीओएम का उपयोग न करने के लिए एक अन्य प्रेरणा यूटीएफ -8 को "डिफ़ॉल्ट" एन्कोडिंग के रूप में प्रोत्साहित करना है।

बीओएम का उपयोग करने के लिए तर्क :

बीओएम का उपयोग करने के लिए तर्क यह है कि इसके बिना, हेरिस्टिक विश्लेषण का निर्धारण यह निर्धारित करने के लिए आवश्यक है कि फ़ाइल किस एन्कोडिंग का उपयोग कर रही है। ऐतिहासिक रूप से ऐसे विश्लेषण, विभिन्न 8-बिट एन्कोडिंग को अलग करने के लिए जटिल, त्रुटि-प्रवण, और कभी-कभी धीमे होते हैं। कार्य को कम करने के लिए कई पुस्तकालय उपलब्ध हैं, जैसे मोज़िला यूनिवर्सल वर्णसेट डिटेक्टर और यूनिकोड के लिए अंतर्राष्ट्रीय घटक।

प्रोग्रामर गलती से मानते हैं कि यूटीएफ -8 का पता लगाना उतना ही मुश्किल है (यह बाइट अनुक्रमों के विशाल बहुमत के कारण अमान्य यूटीएफ -8 नहीं है, जबकि इन पुस्तकालयों को एन्कोडिंग सभी संभावित बाइट अनुक्रमों को अलग करने की कोशिश कर रहे हैं)। इसलिए सभी यूनिकोड-जागरूक कार्यक्रम ऐसे विश्लेषण नहीं करते हैं और इसके बजाय बीओएम पर भरोसा करते हैं।

विशेष रूप से, माइक्रोसॉफ्ट कंपाइलर्स और दुभाषिया, और नोटपैड जैसे माइक्रोसॉफ्ट विंडोज़ पर सॉफ़्टवेयर के कई टुकड़े यूटीएफ -8 पाठ को सही ढंग से नहीं पढ़ेंगे जब तक कि इसमें केवल एएससीआईआई अक्षर नहीं हैं या यह बीओएम से शुरू होता है, और बचत करते समय शुरुआत में बीओएम जोड़ देगा यूटीएफ -8 के रूप में पाठ। जब Google माइक्रोसॉफ्ट वर्ड दस्तावेज़ सादा पाठ फ़ाइल के रूप में डाउनलोड किया जाता है तो Google डॉक्स एक बीओएम जोड़ देगा।

जिस पर बेहतर है, बीओएम के साथ या बिना :

IETF सिफारिश करता है कि यदि कोई प्रोटोकॉल या तो (ए) हमेशा यूटीएफ -8 का उपयोग करता है, या (बी) को यह इंगित करने का कोई अन्य तरीका है कि एन्कोडिंग का उपयोग किस प्रकार किया जा रहा है, तो इसे "हस्ताक्षर के रूप में यू + एफईएफएफ के उपयोग को रोकना चाहिए।"

मेरा निष्कर्ष:

केवल बीओएम का उपयोग करें यदि सॉफ़्टवेयर एप्लिकेशन के साथ संगतता बिल्कुल जरूरी है।

यह भी ध्यान रखें कि संदर्भित विकिपीडिया लेख इंगित करता है कि कई माइक्रोसॉफ्ट एप्लिकेशन बीओएम पर यूटीएफ -8 का सही ढंग से पता लगाने के लिए भरोसा करते हैं, यह सभी माइक्रोसॉफ्ट अनुप्रयोगों के लिए मामला नहीं है। उदाहरण के लिए, जैसा कि @barlop द्वारा इंगित किया गया है, यूटीएफ -8 † के साथ विंडोज कमांड प्रॉम्प्ट का उपयोग करते समय, इस तरह के आदेश और more आदेशों से बीओएम उपस्थित होने की उम्मीद नहीं है। यदि बीओएम मौजूद है, तो यह समस्याग्रस्त हो सकता है क्योंकि यह अन्य अनुप्रयोगों के लिए है।

chcp कमांड कोड पृष्ठ 65001 माध्यम से यूटीएफ -8 (बीओएम के बिना ) के लिए समर्थन प्रदान करता है।


इस प्रश्न में पहले से ही एक लाख और एक जवाब हैं और उनमें से कई काफी अच्छे हैं, लेकिन जब मैं बीओएम का उपयोग नहीं करना चाहिए या नहीं करना चाहता हूं तो मैं कोशिश करना और स्पष्ट करना चाहता हूं।

जैसा कि बताया गया है, यूटीएफ बीओएम (बाइट ऑर्डर मार्क) का कोई भी उपयोग यह निर्धारित करने में करता है कि स्ट्रिंग यूटीएफ -8 है या नहीं, शिक्षित अनुमान है। यदि उचित मेटाडेटा उपलब्ध है (जैसे charset="utf-8" ), तो आप पहले से ही जानते हैं कि आप किस चीज का उपयोग कर रहे हैं, लेकिन अन्यथा आपको परीक्षण करने और कुछ धारणाएं करने की आवश्यकता होगी। इसमें यह जांचना शामिल है कि क्या एक स्ट्रिंग फ़ाइल है जो हेक्साडेसिमल बाइट कोड, ईएफ बीबी बीएफ के साथ शुरू होती है।

यदि यूटीएफ -8 बीओएम से संबंधित एक बाइट कोड पाया जाता है, तो संभावना है कि यह यूटीएफ -8 मान लीजिए और आप वहां से जा सकते हैं। जब यह अनुमान लगाने के लिए मजबूर किया जाता है, हालांकि, पढ़ने के दौरान अतिरिक्त त्रुटि जांच तब भी एक अच्छा विचार होगा जब कुछ गड़बड़ हो जाए। आपको केवल यह मानना ​​चाहिए कि बीओएम यूटीएफ -8 (यानी लैटिन -1 या एएनएसआई) नहीं है अगर इनपुट निश्चित रूप से इसके स्रोत के आधार पर यूटीएफ -8 नहीं होना चाहिए । यदि कोई बीओएम नहीं है, तो आप एन्कोडिंग के खिलाफ सत्यापन करके यह निर्धारित कर सकते हैं कि यह यूटीएफ -8 होना चाहिए या नहीं।

बीओएम की सिफारिश क्यों नहीं की जाती है?

  1. गैर-यूनिकोड-जागरूक या खराब अनुपालन सॉफ़्टवेयर इसे लैटिन -1 या एएनएसआई मान सकता है और बीओएम को स्ट्रिंग से नहीं हटाएगा, जो स्पष्ट रूप से मुद्दों का कारण बन सकता है।
  2. इसकी वास्तव में आवश्यकता नहीं है (केवल यह जांचें कि सामग्री अनुपालनशील है और हमेशा यूटीएफ -8 का उपयोग फॉलबैक के रूप में करते हैं जब कोई अनुपालन एन्कोडिंग नहीं मिल पाती है)

आपको बीओएम के साथ कब एन्कोड करना चाहिए ?

यदि आप मेटाडेटा को किसी अन्य तरीके से रिकॉर्ड करने में असमर्थ हैं (एक वर्णमाला टैग या फ़ाइल सिस्टम मेटा के माध्यम से), और बीओएम जैसे प्रोग्रामों का उपयोग किया जा रहा है, तो आपको बीओएम के साथ एन्कोड करना चाहिए। यह विंडोज़ पर विशेष रूप से सच है जहां बीओएम के बिना कुछ भी आमतौर पर लीगेसी कोड पेज का उपयोग करने के लिए माना जाता है। The BOM tells programs like Office that, yes, the text in this file is Unicode; here's the encoding used.

When it comes down to it, the only files I ever really have problems with are CSV. Depending on the program, it either must, or must not have a BOM. For example, if you're using Excel 2007+ on Windows, it must be encoded with a BOM if you want to open it smoothly and not have to resort to importing the data.


जब आप यूटीएफ -8 में एन्कोडेड जानकारी प्रदर्शित करना चाहते हैं तो आपको समस्याओं का सामना नहीं करना पड़ सकता है। उदाहरण के लिए एक HTML दस्तावेज़ को यूटीएफ -8 के रूप में घोषित करें और आपके पास उस दस्तावेज़ के शरीर में निहित आपके ब्राउज़र में प्रदर्शित सबकुछ होगा।

लेकिन यह तब नहीं है जब हमारे पास टेक्स्ट, CSV और एक्सएमएल फाइलें हों, या तो विंडोज या लिनक्स पर।

उदाहरण के लिए, विंडोज या लिनक्स में एक टेक्स्ट फ़ाइल, कल्पना की जाने वाली सबसे आसान चीजों में से एक है, यह (आमतौर पर) यूटीएफ -8 नहीं है।

इसे एक्सएमएल के रूप में सहेजें और इसे यूटीएफ -8 के रूप में घोषित करें:

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

यह प्रदर्शित नहीं होगा (इसे पढ़ा नहीं जाएगा), भले ही इसे यूटीएफ -8 के रूप में घोषित किया गया हो।

मेरे पास फ्रांसीसी अक्षरों वाले डेटा की एक स्ट्रिंग थी, जिसे सिंडिकेशन के लिए एक्सएमएल के रूप में सहेजने की आवश्यकता थी। बहुत शुरुआत से यूटीएफ -8 फ़ाइल बनाने के बिना (आईडीई में बदलते विकल्प और "नई फ़ाइल बनाएं") या फ़ाइल की शुरुआत में बीओएम जोड़ना

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

मैं एक एक्सएमएल फ़ाइल में फ्रेंच अक्षरों को सहेजने में सक्षम नहीं था।


बीओएम के बिना यूटीएफ -8 में कोई बीओएम नहीं है, जो बीओएम के साथ यूटीएफ -8 से बेहतर नहीं बनाता है, सिवाय इसके कि जब फ़ाइल के उपभोक्ता को पता होना चाहिए (या जानने से लाभ होगा) कि फ़ाइल यूटीएफ -8-एन्कोडेड है या नहीं या नहीं।

बीओएम आमतौर पर एन्कोडिंग की समाप्ति को निर्धारित करने के लिए उपयोगी होता है, जो अधिकांश उपयोग मामलों के लिए आवश्यक नहीं है।

साथ ही, बीओएम उन उपभोक्ताओं के लिए अनावश्यक शोर / दर्द हो सकता है जो इसके बारे में नहीं जानते या उनकी परवाह नहीं करते हैं, और परिणामस्वरूप उपयोगकर्ता भ्रम हो सकता है।


बीओएम के साथ यूटीएफ -8 केवल तभी मदद करता है जब फ़ाइल में वास्तव में कुछ गैर-ASCII वर्ण हों। यदि इसमें शामिल है और कोई भी नहीं है, तो यह संभवतः पुराने अनुप्रयोगों को तोड़ देगा जो अन्यथा फ़ाइल को सादा ASCII के रूप में व्याख्या करेंगे। जब वे एक गैर ASCII चरित्र में आते हैं तो ये एप्लिकेशन निश्चित रूप से असफल हो जाएंगे, इसलिए मेरी राय में बीओएम केवल तभी जोड़ा जाना चाहिए जब फाइल कर सकती है, और अब सादे ASCII के रूप में व्याख्या नहीं की जानी चाहिए।

संपादित करें: बस यह स्पष्ट करना चाहते हैं कि मुझे बीओएम नहीं होना पसंद है, अगर इसमें कुछ पुरानी बकवास टूट जाती है, और उस विरासत आवेदन को बदलना संभव नहीं है।

यूटीएफ 8 के लिए बीओएम की अपेक्षा न करें।


बीओएम पर विकिपीडिया पेज के नीचे उद्धृत: http://en.wikipedia.org/wiki/Byte-order_mark#cite_note-2

"बीओएम का उपयोग न तो आवश्यक है और न ही यूटीएफ -8 के लिए अनुशंसित है, लेकिन उन संदर्भों में सामना किया जा सकता है जहां यूटीएफ -8 डेटा अन्य एन्कोडिंग फॉर्मों से परिवर्तित होता है जो बीओएम का उपयोग करते हैं या जहां बीओएम को यूटीएफ -8 हस्ताक्षर के रूप में उपयोग किया जाता है"


मैं इसे एक अलग परिप्रेक्ष्य से देखता हूं। मुझे लगता है कि बीओएम के साथ यूटीएफ -8 बेहतर है क्योंकि यह फ़ाइल के बारे में अधिक जानकारी प्रदान करता है। मैं केवल बीओएम के बिना यूटीएफ -8 का उपयोग करता हूं अगर मुझे समस्याएं आती हैं।

मैं लंबे समय से अपने पृष्ठों पर कई भाषाओं (यहां तक ​​कि Cyrillic ) का उपयोग कर रहा हूं और जब फ़ाइलों को बीओएम के बिना सहेजा जाता है और मैं उन्हें एक संपादक के साथ संपादित करने के लिए फिर से खोलता हूं (जैसा कि cherouvim भी नोट किया गया है), कुछ वर्ण दूषित हैं।

ध्यान दें कि जब आप यूटीएफ -8 एन्कोडिंग के साथ एक नई बनाई गई फ़ाइल को सहेजने का प्रयास करते हैं तो Windows 'क्लासिक Notepad स्वचालित रूप से बीओएम के साथ फ़ाइलों को सहेजता है।

मैं व्यक्तिगत रूप से सर्वर साइड स्क्रिप्टिंग फ़ाइलों (.asp, .ini, .aspx) को बीओएम के बिना बीओएम और .html फ़ाइलों के साथ सहेजता हूं।


यह ध्यान दिया जाना चाहिए कि कुछ फ़ाइलों के लिए आपके पास विंडोज़ पर भी बीओएम नहीं होना चाहिए । उदाहरण SQL*plus या VBScript फाइलें हैं। यदि ऐसी फ़ाइलों में बीओएम होता है तो आपको निष्पादित करने का प्रयास करते समय आपको एक त्रुटि मिलती है।


यूटीएफ -8 एन्कोडेड फाइलों में बीओएम डालने के साथ कम से कम तीन समस्याएं हैं।

  1. जिन फ़ाइलों में कोई टेक्स्ट नहीं है वे अब खाली नहीं हैं क्योंकि उनमें हमेशा बीओएम होता है।
  2. यूटीएफ -8 के एएससीआईआई सबसेट के भीतर पाठ रखने वाली फ़ाइलें अब एएससीआईआई नहीं हैं क्योंकि बीओएम एएससीआईआई नहीं है, जो कुछ मौजूदा टूल्स को तोड़ देता है, और उपयोगकर्ताओं के लिए ऐसे विरासत उपकरण को प्रतिस्थापित करना असंभव हो सकता है।
  3. कई फाइलों को एक साथ जोड़ना संभव नहीं है क्योंकि प्रत्येक फ़ाइल में शुरुआत में बीओएम है।

और, जैसा कि अन्य ने उल्लेख किया है, यह बीओएम को यह पता लगाने के लिए पर्याप्त नहीं है कि न ही यूटीएफ -8 है:

  • यह पर्याप्त नहीं है क्योंकि बीओएम का गठन करने वाले सटीक अनुक्रम के साथ शुरू करने के लिए एक मनमाना बाइट अनुक्रम हो सकता है।
  • यह जरूरी नहीं है क्योंकि आप बाइट्स को पढ़ सकते हैं जैसे कि वे यूटीएफ -8 थे; यदि यह सफल होता है, तो परिभाषा के अनुसार, वैध यूटीएफ -8 है।

As mentioned above, UTF-8 with BOM may cause problems with non-BOM-aware (or compatible) software. I once edited HTML files encoded as UTF-8 + BOM with the Mozilla-based KompoZer , as a client required that WYSIWYG program.

Invariably the layout would get destroyed when saving. It took my some time to fiddle my way around this. These files then worked well in Firefox, but showed a CSS quirk in Internet Explorer destroying the layout, again. After fiddling with the linked CSS files for hours to no avail I discovered that Internet Explorer didn't like the BOMfed HTML file. Never again.

Also, I just found this in Wikipedia:

The shebang characters are represented by the same two bytes in extended ASCII encodings, including UTF-8, which is commonly used for scripts and other text files on current Unix-like systems. However, UTF-8 files may begin with the optional byte order mark (BOM); if the "exec" function specifically detects the bytes 0x23 0x21, then the presence of the BOM (0xEF 0xBB 0xBF) before the shebang will prevent the script interpreter from being executed. Some authorities recommend against using the byte order mark in POSIX (Unix-like) scripts,[15] for this reason and for wider interoperability and philosophical concerns


From http://en.wikipedia.org/wiki/Byte-order_mark :

The byte order mark (BOM) is a Unicode character used to signal the endianness (byte order) of a text file or stream. Its code point is U+FEFF. BOM use is optional, and, if used, should appear at the start of the text stream. Beyond its specific use as a byte-order indicator, the BOM character may also indicate which of the several Unicode representations the text is encoded in.

Always using a BOM in your file will ensure that it always opens correctly in an editor which supports UTF-8 and BOM.

My real problem with the absence of BOM is the following. Suppose we've got a file which contains:

abc

Without BOM this opens as ANSI in most editors. So another user of this file opens it and appends some native characters, for example:

abg-αβγ

Oops... Now the file is still in ANSI and guess what, "αβγ" does not occupy 6 bytes, but 3. This is not UTF-8 and this causes other problems later on in the development chain.


The Unicode Byte Order Mark (BOM) FAQ provides a concise answer:

Q: How I should deal with BOMs?

A: Here are some guidelines to follow:

  1. A particular protocol (eg Microsoft conventions for .txt files) may require use of the BOM on certain Unicode data streams, such as files. When you need to conform to such a protocol, use a BOM.

  2. Some protocols allow optional BOMs in the case of untagged text. In those cases,

    • Where a text data stream is known to be plain text, but of unknown encoding, BOM can be used as a signature. If there is no BOM, the encoding could be anything.

    • Where a text data stream is known to be plain Unicode text (but not which endian), then BOM can be used as a signature. If there is no BOM, the text should be interpreted as big-endian.

  3. Some byte oriented protocols expect ASCII characters at the beginning of a file. If UTF-8 is used with these protocols, use of the BOM as encoding form signature should be avoided.

  4. Where the precise type of the data stream is known (eg Unicode big-endian or Unicode little-endian), the BOM should not be used. In particular, whenever a data stream is declared to be UTF-16BE, UTF-16LE, UTF-32BE or UTF-32LE a BOM must not be used.


UTF with BOM is better if you use UTF-8 in HTML files, if you use Serbian Cyrillic, Serbian Latin, German, Hungarian or something exotic language in the same page. That is my opinion (30 years of computing and IT industry).





byte-order-mark