UTF-8 और ISO-8859-1 में क्या अंतर है?


जवाबों:


321

UTF-8 एक मल्टीबैट एन्कोडिंग है जो किसी भी यूनिकोड वर्ण का प्रतिनिधित्व कर सकता है। आईएसओ 8859-1 एक एकल-बाइट एन्कोडिंग है जो पहले 256 यूनिकोड वर्णों का प्रतिनिधित्व कर सकता है। दोनों ASCII को ठीक उसी तरह से एनकोड करते हैं।


11
एक बात का ध्यान रखें कि ASCII 0 से 127 तक फैली हुई है। MSB हमेशा 0. है
रितिक

3
जब 127 से ऊपर कोड बिंदु परिभाषित किए जाते हैं, तो एन्कोडिंग सिस्टम विस्तारित ASCII का एक संस्करण है।
रोहन भले

1
@RohanBhale ASCII विस्तारित वाक्यांश का उपयोग न करें; यह केवल भ्रम पैदा करेगा।
मिस्टर लिस्टर

लेकिन बढ़ाए गए एएससीआई सही शब्द हो सकते हैं। मैंने इसे कई संसाधनों पर पढ़ा
रोहन भाले

135

विकिपीडिया दोनों को यथोचित रूप से समझाता है: UTF-8 बनाम लैटिन -1 (ISO-8859-1)। पूर्व एक चर-लंबाई एन्कोडिंग है, बाद वाला एकल-बाइट निश्चित लंबाई एन्कोडिंग है। लैटिन -1 यूनिकोड वर्ण सेट के पहले 256 कोड बिंदुओं को एन्कोड करता है, जबकि UTF-8 का उपयोग अन्य कोड बिंदुओं को एनकोड करने के लिए किया जा सकता है। भौतिक एन्कोडिंग स्तर पर, केवल कोडपॉइंट्स 0 - 127 अनौपचारिक रूप से एन्कोडेड हो जाते हैं; कोड अंक 128 - 255 यूटीएफ -8 के साथ 2-बाइट अनुक्रम बनने से भिन्न होते हैं, जबकि वे लैटिन -1 के साथ एकल बाइट्स होते हैं।


@ एमयू शायद मेरा बयान अस्पष्ट था, लेकिन यह गलत नहीं है - मैं एन्कोडेड बाइट अनुक्रमों के बारे में बात नहीं कर रहा था, बल्कि चरित्र सेट एन्कोडेड हो रहा था; इसका अर्थ है कि ISO-8859-1 का उपयोग यूनिकोड वर्ण सेट के पहले 256 कोड बिंदुओं को एनकोड करने के लिए किया जाता है।
StaxMan

मेरे और "अस्पष्ट" के लिए आपका स्पष्टीकरण काम करता है "गलत" की तुलना में बेहतर शब्द विकल्प होगा।
म्यू बहुत छोटा है

83

UTF

UTF मल्टी-बाइट एन्कोडिंग योजनाओं का एक परिवार है जो यूनिकोड कोड बिंदुओं का प्रतिनिधित्व कर सकता है जो 2 ^ 31 [लगभग 2 बिलियन] वर्णों का प्रतिनिधि हो सकता है। UTF-8 एक लचीली एन्कोडिंग प्रणाली है जो पहले 2 ^ 21 [लगभग 2 मिलियन] कोड बिंदुओं का प्रतिनिधित्व करने के लिए 1 और 4 बाइट्स के बीच का उपयोग करती है।

लंबी कहानी छोटी: 127 से नीचे एक कोड बिंदु / क्रमिक प्रतिनिधित्व वाला कोई भी चरित्र, उर्फ ​​7-बिट-सुरक्षित एएससीआईआई को 1-बाइट अनुक्रम द्वारा सबसे अन्य एकल-बाइट एन्कोडिंग के रूप में दर्शाया गया है। 127 से ऊपर कोड बिंदु वाले किसी भी चरित्र को दो या अधिक बाइट्स के अनुक्रम द्वारा दर्शाया गया है, एन्कोडिंग के विवरण के साथ यहां सबसे अच्छा समझाया गया है

आईएसओ 8859

ISO-8859 एकल-बाइट एन्कोडिंग योजनाओं का एक परिवार है जिसका उपयोग वर्णमाला का प्रतिनिधित्व करने के लिए किया जाता है जिसे 127 से 255 के भीतर दर्शाया जा सकता है। इन विभिन्न वर्णमालाओं को ISO-8859- n प्रारूप में "भागों" के रूप में परिभाषित किया गया है , जो सबसे अधिक परिचित हैं। इनकी संभावना ISO-8859-1 उर्फ 'लैटिन -1' है। यूटीएफ -8 के साथ, 7-बिट-सुरक्षित एएससीआईआई का उपयोग किए गए एन्कोडिंग परिवार की परवाह किए बिना अप्रभावित रहता है।

इस एन्कोडिंग योजना की खामी 128 से अधिक प्रतीकों वाली भाषाओं को समायोजित करना या एक समय में प्रतीकों के एक से अधिक परिवारों को सुरक्षित रूप से प्रदर्शित करने में असमर्थता है। साथ ही, ISO-8859 एनकोडिंग UTF के उदय के पक्ष में हो गए हैं। इसका प्रभारी आईएसओ "वर्किंग ग्रुप" 2004 में भंग कर दिया गया, जिससे इसके मूल उपसमिति तक रखरखाव हो गया।


1
प्रश्न का उत्तर देने के लिए +1 लेकिन इससे आगे जाकर संबंधित एन्कोडिंग के बारे में जानकारी प्रदान करना। पुन :: UTF-8 के लिए कोड अंक, stackoverflow.com/a/38488358/3353984 के अनुसार , UTF-8 2 ^ 21 कोड बिंदुओं का समर्थन करता है। क्या यह एक त्रुटि है, या यहां एक फिक्स की आवश्यकता हो सकती है?
टॉम लोर्डो

1
यूनिकोड वास्तव में 2 ^ 16 कोड बिंदुओं के 17 विमान हैं। 0x00_0000 से 0x1F_FFFF 17 विमानों में 1,114,112 कोड पॉइंट हो सकते हैं। इनमें से, 2,048 सरोगेट हैं, 66 गैर-वर्ण हैं, और 137,468 निजी उपयोग के लिए आरक्षित हैं, जो 9 असाइनमेंट के लिए 9 असाइन किया गया है। देख सकते हैं कि कितने वर्ण UTF-8 को एन्कोड कर सकते हैं?
georgeawg

22
  • ASCII: 7 बिट्स। 128 कोड अंक।

  • आईएसओ-8859-1: 8 बिट्स। 256 कोड अंक।

  • UTF-8: 8-32 बिट्स (1-4 बाइट्स)। 1,112,064 कोड अंक।

ISO-8859-1 और UTF-8 दोनों ASCII के साथ संगत हैं, लेकिन UTF-8 ISO-8859-1 के साथ पीछे की ओर संगत नहीं है:

#!/usr/bin/env python3

c = chr(0xa9)
print(c)
print(c.encode('utf-8'))
print(c.encode('iso-8859-1'))

आउटपुट:

©
b'\xc2\xa9'
b'\xa9'

21

ISO-8859-1 1980 के दशक में वापस से एक विरासत मानक है। यह केवल 256 वर्णों का प्रतिनिधित्व कर सकता है इसलिए केवल पश्चिमी दुनिया की कुछ भाषाओं के लिए उपयुक्त है। यहां तक ​​कि कई समर्थित भाषाओं के लिए, कुछ अक्षर गायब हैं। यदि आप इस एन्कोडिंग में एक पाठ फ़ाइल बनाते हैं और कुछ चीनी अक्षरों को कॉपी / पेस्ट करते हैं, तो आपको अजीब परिणाम दिखाई देंगे। इसलिए दूसरे शब्दों में, इसका उपयोग न करें। यूनिकोड ने दुनिया भर में ले लिया है और इन दिनों UTF-8 बहुत अधिक मानक है जब तक कि आपके पास कुछ विरासत कारण नहीं हैं (जैसे HTTP हेडर जो कि सब कुछ के साथ संगत करने की आवश्यकता है)।


1
मैंने देखा था कि यूम्लूट को यूटीएफ 8 के साथ नहीं बदला जाता है। हमने इसके उदाहरण देखे और खोजने में हमें ISO-8859-1 मिला और यह काम करने लगता है। हमारे पास बहुत से जर्मन वैज्ञानिक हैं जिनके साथ हम काम करते हैं।
87

4
उमलूट को utf8 में दो वर्णों के रूप में दर्शाया गया है। वे ठीक से काम करते हैं और अच्छी तरह से काम करते हैं। समस्या उन कार्यक्रमों से आती है जो प्रति चरित्र 1 बाइट की अपेक्षा करते हैं। इन विरासत कार्यक्रमों के लिए, ISO-8859-1 में 1-बाइट umlaut है।
एरिक एरोनिटी

3

एक अन्य दृष्टिकोण से, यूनिकोड और एससीआई एन्कोडिंग दोनों फाइलें पढ़ने में असफल हो जाती हैं क्योंकि उनमें एक बाइट 0xc0होती है, यह iso-8859-1 द्वारा ठीक से पढ़ी गई लगती है। चेतावनी यह है कि फ़ाइल में बेशक यूनिकोड वर्ण नहीं होना चाहिए।


2

महसूस करने के लिए एक और महत्वपूर्ण बात: यदि आप देखते हैं iso-8859-1, तो यह संभवतः ISO / IEC 8859-1 के बजाय Windows-1252 को संदर्भित करता है । वे 0x80–0x9F श्रेणी में भिन्न होते हैं, जहाँ ISO 8859-1 में C1 नियंत्रण कोड हैं, और Windows-1252 में इसके बजाय उपयोगी दृश्य वर्ण हैं।

उदाहरण के लिए, आईएसओ 8859-1 में एक नियंत्रण चरित्र के रूप में 0x85 (यूनिकोड, यू + 0085, ``) में है, जबकि विंडोज -1252 में एक क्षैतिज दीर्घवृत्त (यूनिकोड, यू + 2026 हॉर्टिकल्चर ELLIPSIS) में है। ) में है।

WHATWG एन्कोडिंग कल्पना (HTML के रूप में नहीं होता) स्पष्ट रूप से घोषणा करता है iso-8859-1के लिए एक लेबल होना करने के लिए windows-1252, और वेब ब्राउज़र किसी भी तरह से आईएसओ 8859-1 का समर्थन नहीं करते: HTML कल्पना का कहना है कि एन्कोडिंग कल्पना में सभी एन्कोडिंग समर्थन किया जाना चाहिए, और कोई और अधिक ।

ब्याज की भी, HTML संख्यात्मक चरित्र संदर्भ अनिवार्य रूप से यूनिकोड कोड बिंदुओं के बजाय 8-बिट मूल्यों के लिए Windows-1252 का उपयोग करते हैं; प्रति https://html.spec.whatwg.org/#numeric-character-reference-end-state , …U + 0085 के बजाय U + 2026 का उत्पादन करेगा।


ऊप्स! सोचा था कि मैंने लिखा होगा, लेकिन मैंने इसे फिर से लिखा। मैंने अभी इसमें लगाया है।
क्रिस मॉर्गन

0

इस प्रश्न पर शोध करने का मेरा कारण यह था कि वे किस तरह से संगत हैं। लैटिन 1 चारसेट (iso-8859) एक utf8 डेटास्टोर में संग्रहीत होने के लिए 100% संगत है। सभी ascii और विस्तारित-ascii आकर्षण एकल-बाइट के रूप में संग्रहीत किए जाएंगे।

दूसरे रास्ते पर जा रहे हैं, utf8 से लेकर लैटिन 1 तक चारसेट काम कर सकते हैं या नहीं भी। यदि कोई 2-बाइट चार्ट (विस्तारित-एससीआई 255 से आगे के वर्ण) हैं, तो वे एक लैटिन 1 डेटासटोर में स्टोर नहीं करेंगे।


2
मददगार, लेकिन मुझे लगता है कि आप 255 के बजाय विस्तारित-आस्की 255 में मतलब है?
हाइड्रोपर

18
लैटिन -1, या iso-8859-1 utf8 में संग्रहीत होने के लिए 100% संगत नहीं है। 127 से ऊपर के किसी भी लैटिन-एन या आइसो-8859-एन चरित्र को एक एकल बाइट utf-8 चरित्र में अनुवादित नहीं किया जाएगा। हालांकि, 1-127 मूल्यों के लिए, वे बिल्कुल अनुवाद करेंगे।
मर्लिन पियर्स

4
यह उत्तर "विस्तारित अस्सी" शब्द के उपयोग में थोड़ा भ्रमित है, जो कि किसी भी वर्ण एन्कोडिंग का संदर्भ देने के लिए एक शब्द है जो ASCII नहीं है। UTF-8 और लैटिन -1 विस्तारित ASCII एनकोडिंग के उदाहरण हैं। लेकिन, गैर-एससीआई लैटिन -1 अक्षर (यानी 127 से ऊपर कोड अंक) को यूटीएफ -8 में एक बाइट के रूप में एनकोड नहीं किया जा सकता है।
rdb
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.