क्या मेरा स्रोत कोड UTF-8 में होना चाहिए?


10

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

मैं यह मान रहा हूं कि लिखा गया लगभग सभी कोड ASCII है, लेकिन यह ASCII क्यों होना चाहिए? क्या हमें वास्तव में स्रोत कोड के लिए UTF-8 फ़ाइलों का उपयोग करना चाहिए, और क्यों? मुझे लगता है कि यह बहुभाषी टीमों पर उपयोगी हो सकता है। क्या बहुभाषी टीमों के नाम चर / कार्यों / आदि से जुड़े हैं?


6
मैं क्लिंगन में अपने सभी कोड लिखता हूं, आप असंवेदनशील क्लोद!

5
@JackManey: यह / नहीं है। आप असंवेदनशील गँवार!
FrustratedWithFormsDesigner

और क्लिंगन स्क्रिप्ट यूनिकोड में नहीं है, इसलिए आपको "निजी उपयोग" वर्ण या ASCII लिप्यंतरण का उपयोग करना होगा।
dan04

@ dan04: क्लिंगन के पास BMP के निजी उपयोग वाले भाग का एक छद्म मानक उपयोग है ( ConScript रजिस्ट्री देखें ) :-)
रॉस पैटरसन

यहाँ के तर्कों को भी देखें: utf8everywhere.org
रोरी हंटर

जवाबों:


23

विकल्प ASCII और UTF-8 के बीच नहीं है। ASCII एक 7-बिट एन्कोडिंग है, और UTF-8 इसे अधिगृहीत करता है - कोई भी मान्य ASCII पाठ भी UTF-8 मान्य है। जब आप गैर-ASCII वर्णों का उपयोग करते हैं तो समस्याएँ उत्पन्न होती हैं; इसके लिए आपको UTF-8, UTF-16, UTF-32 और विभिन्न 8-बिट एनकोडिंग (ISO-xxxx, आदि) के बीच चयन करना होगा।

सबसे अच्छा समाधान एक सख्त ASCII चारसेट के साथ रहना है, अर्थात, अपने कोड में किसी भी गैर- ASCII वर्ण का उपयोग न करें। अधिकांश प्रोग्रामिंग भाषाएं ASCII वर्णों का उपयोग करके गैर-ASCII वर्णों को व्यक्त करने के तरीके प्रदान करती हैं, उदाहरण के "\u1234"लिए 1234 पर यूनिकोड कोड बिंदु को इंगित करना। विशेष रूप से, पहचानकर्ताओं के लिए गैर-ASCII वर्णों का उपयोग करने से बचें। यहां तक ​​कि अगर वे सही ढंग से काम करते हैं, तो एक अलग कीबोर्ड लेआउट का उपयोग करने वाले लोग आपको इन पात्रों को टाइप करने के लिए शाप देने जा रहे हैं।

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

और फिर आपके पास एन्कोडिंग है जो आपके कोड को संसाधित करता है; यह आपके स्रोत फ़ाइल के एन्कोडिंग के समान नहीं है। उदाहरण के लिए, मैं आसानी से यूटीएफ -8 में पीएचपी लिख सकता हूं, लेकिन लैटिन -1, इसके आंतरिक मल्टीबैट-एन्कोडिंग को सेट कर सकता हूं; क्योंकि PHP पार्सर खुद को एन्कोडिंग के साथ चिंता नहीं करता है, बल्कि सिर्फ बाइट अनुक्रम पढ़ता है, मेरे UTF-8 स्ट्रिंग साहित्यिकों को लैटिन -1 के रूप में गलत समझा जाएगा। यदि मैं इन तारों को UTF-8 टर्मिनल पर आउटपुट करता हूं, तो आपको कोई अंतर दिखाई नहीं देगा, लेकिन स्ट्रिंग की लंबाई और अन्य मल्टीबाइट ऑपरेशन (जैसे substr) गलत परिणाम उत्पन्न करेंगे।

अंगूठे का मेरा नियम सब कुछ के लिए UTF-8 का उपयोग करना है; केवल अगर आपको पूरी तरह से अन्य एन्कोडिंग से निपटना है, तो यूटीएफ -8 में जल्द से जल्द और यूटीएफ -8 से जितना संभव हो उतना देर से परिवर्तित करें।


6

अधिकांश IDE, UTF-8 एन्कोडिंग के साथ सहेजने के लिए डिफ़ॉल्ट होंगे, और विकल्प दिए जाने पर आपको लगभग निश्चित रूप से UTC-8 को ASCII में चुनना चाहिए। यह सुनिश्चित करेगा कि आप अंतर्राष्ट्रीयकरण कोड के साथ अजीब समस्याओं में न चलें।


2
आप ऐसा प्रतीत कर रहे हैं मानो ASCII बनाम UTF-8 एक विकल्प है। जब किसी फ़ाइल में गैर- ASCII वर्ण होते हैं, तो यह नहीं है। वहाँ केवल ASCII वर्ण हैं, UTF-8 है ASCII।
फ्रेड फू

मैं चाहता हूं कि ग्रहण इसका पालन करे। प्रथम वर्ष के सीएस-ईश छात्र के रूप में, मेरे भगवान समूहों में काम करते समय कई सिरदर्द का कारण रहे हैं, जहां ओएस एक्स, विंडोज और लिनक्स उपयोगकर्ताओं की उपस्थिति है। (संदर्भ के लिए यह मैक एक्सरॉन पर ओएस एक्स, सीपी -1252 को विंडोज पर डिफॉल्ट करता है और मैं भूल गया कि कौन सा लिनक्स पर है, लेकिन आप इसे एक अलग से शर्त लगाते हैं।)
लेफिंग्स

@leflings - शायद एक डिफ़ॉल्ट वातावरण एन्कोडिंग है जो वर्तमान में आमतौर पर UTF-8 है।
मैकीज पीचोटका

1

स्रोत कोड में उद्धृत स्ट्रिंग्स या वर्णों में सादे पाठ टाइप करने में सक्षम होने और वास्तविक चरित्र को देखने में सक्षम होना बहुत अच्छा है। उदाहरण के लिए pi प्रतीक 'π' या विचारधारा 'are' विचारधारा के लिए pi और L '\ u2000A' के समकक्ष '\ u3c0' की तुलना में बहुत अच्छे हैं।

एक सभ्य संपादक में, जैसे ही आप ASCII वर्ण होंगे, वैसे ही इन अक्षरों को सीधे स्रोत कोड में टाइप और / या कॉपी और पेस्ट करना संभव है।

मुझे ऐसे ठोस उदाहरण मिलते हैं जो उन बातों को समझने और समझने में सहायक होते हैं, जिनका वर्णन शब्द कभी-कभी घर चलाने के लिए नहीं लगता है। निम्न संक्षिप्त उदाहरण कोड स्निपेट जैसे स्रोत कोड में टाइप किए गए यूनिकोड वर्ण स्थिरांक को संकल्पित करें:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

ASCII टिल्ड वर्ण '~' को ASCII या UTF-8 स्रोत फ़ाइल में सहेजा जा सकता है, लेकिन यूनिकोड वर्ण ASCII रूप में संग्रहीत नहीं किए जा सकते हैं। PI प्रतीक 'PI' यूनिकोड कोड बिंदु 0x3c0 है और इसे UTF-8 फॉर्म में दो बाइट मान 0xcf, 0x80 के रूप में संग्रहीत किया जा सकता है। यूनिकोड कोड पर Ideographs 0x2000a और 0x2893d को 4 बाइट UTF-8 अनुक्रम की आवश्यकता होती है।

उन पात्रों के लिए उनके इच्छित मूल्यों को बनाए रखने के लिए और उन्हें व्याख्या करने के लिए संकलक के रूप में, स्रोत कोड को एक प्रारूप में सहेजने की आवश्यकता होती है जो यूनिकोड वर्ण सेट का समर्थन करता है, जैसे कि यूटीएफ -8 या यूटीएफ -16। यदि UTF-8 के रूप में सहेजा जाता है, तो एक सभ्य संकलक समझेगी और व्याख्या करेगी जैसा कि इरादा है और एक सभ्य संपादक ठीक से वर्णों को लोड और प्रदर्शित करेगा।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.