विकल्प 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 से जितना संभव हो उतना देर से परिवर्तित करें।