2008-09-25 18 views
10

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

हम अपने मुद्दों के माध्यम से काम कर रहे हैं, लेकिन मैं सोच रहा था: क्या सी ++ कोड लिखने के लिए वहां एक अच्छी "गाइड" है जो 8-बिट अक्षरों के लिए डिज़ाइन की गई है और यूटीएफ -8 डेटा को सही तरीके से काम करेगा यह?

मैं सभी को पूरे यूनिकोड मानक को पढ़ने की उम्मीद नहीं कर सकता, लेकिन अगर कुछ और पचाने योग्य उपलब्ध है, तो मैं इसे टीम के साथ साझा करना चाहता हूं ताकि हम इन मुद्दों में फिर से भाग न सकें।

wchar_t या किसी अन्य स्ट्रिंग प्रस्तुति का उपयोग करने के लिए सभी अनुप्रयोगों को दोबारा लिखना इस समय संभव नहीं है। मैं यह भी ध्यान दूंगा कि ये एप्लिकेशन उन सर्वरों और उपकरणों के साथ नेटवर्क पर संचार करते हैं जो 8-बिट वर्णों का उपयोग करते हैं, इसलिए यदि हमने आंतरिक रूप से यूनिकोड किया है, तो भी हमें सीमाओं पर अनुवाद के साथ समस्याएं होंगी। अधिकांश भाग के लिए, ये एप्लिकेशन बस डेटा पास करते हैं; वे टेक्स्ट को स्थान से कॉपी करने के अलावा किसी अन्य तरीके से पाठ को "संसाधित नहीं करते"।

विंडोज ऑपरेटिंग सिस्टम विंडोज और लिनक्स हैं। हम std :: स्ट्रिंग और सादे-पुराने सी तारों का उपयोग करते हैं। (और मुझे डिजाइन फैसले से किसी की रक्षा के लिए पूछना नहीं है मैं सिर्फ गंदगी ठीक करने के लिए कोशिश कर रहा हूँ।।)


यहाँ क्या सुझाव दिया गया है की एक सूची है:

+0

क्या आप हमारे ऐप के ओएस की पुष्टि कर सकते हैं? क्या आप विंडोज के लिए प्रोग्रामिंग कर रहे हैं? क्या आप बड़े पैमाने पर std :: स्ट्रिंग या अधिक निचले स्तर सी हेडर का उपयोग कर रहे हैं? – paercebal

+0

यदि आपको कोई जवाब पसंद है, तो कृपया इसे ऊपर उठाएं - डांटने का कोई कारण नहीं है। –

+0

केवल 30 मिनट, और आप पहले ही एक प्रतिनिधि को बढ़ावा देने की मांग कर रहे हैं? :) –

उत्तर

-1

आप विस्तृत ग उपयोग कर सकते हैं haracters (std :: स्ट्रिंग के बजाय चार और std :: wstring के बजाय wchar_t)। यह आपकी समस्याओं का 100% स्वचालित रूप से हल नहीं करता है, लेकिन यह पहला कदम है।

स्ट्रिंग फ़ंक्शंस का भी उपयोग करें जो यूनिकोड-जागरूक हैं (दस्तावेज़ीकरण देखें)। अगर कुछ व्यापक वर्णों या स्ट्रिंग में हेरफेर करता है तो आम तौर पर यह पता चलता है कि वे व्यापक हैं।

+0

विभिन्न वर्ण प्रस्तुतिकरणों का उपयोग करने के लिए सभी अनुप्रयोगों को दोबारा लिखना संभव नहीं है। –

1

पता है कि पूर्ण यूनिकोड 16 बिट अक्षरों में फिट नहीं करता है हो सकता है; तो या तो 32-बिट वर्णों का उपयोग करें, या चर-चौड़ाई एन्कोडिंग (यूटीएफ -8 सबसे लोकप्रिय है)।

0

आईस्लैंडिक् आईएसओ लैटिन 1 का उपयोग करता है, इसलिए आठ बिट्स पर्याप्त होना चाहिए। क्या हो रहा है यह जानने के लिए हमें अधिक जानकारी चाहिए।

+0

मैं किसी को भी यह जानने में मदद नहीं कर रहा हूं कि क्या गलत है। मैं यूटीएफ -8 से निपटने के लिए सामान्य मार्गदर्शन और "सर्वोत्तम प्रथाओं" की तलाश में हूं। –

1

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

+0

हां, यही कारण है कि हम आश्चर्यचकित हैं कि यूटीएफ -8 ने समस्याओं का सामना किया है। हम आठवें बिट के साथ विशेष कुछ नहीं कर रहे हैं, लेकिन ऐसा लगता है कि हम कुछ स्थानों पर चीजें कर रहे हैं जिससे टेक्स्ट को गलत तरीके से गलत तरीके से संशोधित किया जा सकता है या संशोधित किया जा सकता है। –

+1

ध्यान दें कि ASCII प्रति बाइट 1 बाइट है। यूटीएफ -8 एक बहु-बाइट प्रति चरित्र है (जब ASCII इतनी आकस्मिक गणना नहीं होती है)। तो कोई भी तरीका जो प्रति बाइट 1 बाइट मानता है वह काम नहीं करेगा। जैसेलंबाई() –

10

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

यूटीएफ -8 का लाभ यह है कि आप हमेशा यह बता सकते हैं कि आप एक बहु-बाइट चरित्र में कहां हैं: यदि बिट 7 सेट किया गया है और बिट 6 रीसेट (बाइट 0x80-0xBF है) यह एक पिछला बाइट है, जबकि बिट्स 7 और 6 सेट हैं और 5 रीसेट (0xC0-0xDF) है, यह एक पीछे बाइट के साथ एक लीड बाइट है; यदि 7, 6 और 5 सेट हैं और 4 रीसेट (0xE0-0xEF) है तो यह दो पिछला बाइट्स वाला एक मुख्य बाइट है, और इसी तरह। सबसे महत्वपूर्ण बिट पर सेट लगातार बिट्स की संख्या चरित्र बनाने वाले बाइट्स की कुल संख्या है। यही कारण है:

110x xxxx = दो-बाइट वर्ण
1110 xxxx = तीन-बाइट वर्ण
1111 0xxx = चार-बाइट वर्ण
आदि

आइसलैंडिक वर्णमाला सभी आईएसओ 8859-1 में निहित है और इसलिए विंडोज -1252। यदि यह एक कंसोल-मोड एप्लिकेशन है, तो ध्यान रखें कि कंसोल आईबीएम कोडपेज का उपयोग करता है, इसलिए (सिस्टम लोकेल के आधार पर) यह 437, 850, या 861 में प्रदर्शित हो सकता है। यूटीएफ -8 के लिए विंडोज़ का मूल प्रदर्शन समर्थन नहीं है; आपको यूटीएफ -16 में बदलना होगा और यूनिकोड एपीआई का उपयोग करना होगा।

कॉलिंग सेटकोनोलसीपी और सेटकंसोलऑटपुटसीपी को कॉल करना, कोडपेज 1252 निर्दिष्ट करना, आपकी समस्या से मदद करेगा, अगर यह कंसोल-मोड एप्लिकेशन है। दुर्भाग्य से चयनित कंसोल फ़ॉन्ट एक फ़ॉन्ट होना चाहिए जो कोडपेज का समर्थन करता है, और मैं फ़ॉन्ट सेट करने का कोई तरीका नहीं देख सकता। मानक बिटमैप फोंट केवल सिस्टम डिफ़ॉल्ट OEM कोडपृष्ठ का समर्थन करते हैं।

1

आप icu देख सकते हैं। उनके पास उपलब्ध फ़ंक्शंस हो सकते हैं जो यूटीएफ -8 तारों के साथ काम करना आसान बनाते हैं।

0

फ्रांसीसी, जर्मन और पश्चिमी यूरोप की अधिकांश अन्य भाषाओं जैसे आइसलैंडिक को 8-बिट वर्ण सेट (विंडोज़ पर सीपी 1252, आईएसओ 885 9 -1 उर्फ ​​लैटिन 1 * एक्स पर) का उपयोग करके समर्थित किया जा सकता है। यूनिकोड का आविष्कार करने से पहले यह मानक दृष्टिकोण था, और अभी भी काफी आम है। जैसा कि आप कहते हैं कि आपको एक बाधा है कि आप wchar का उपयोग करने के लिए अपने ऐप को फिर से लिख नहीं सकते हैं, और आपको इसकी आवश्यकता नहीं है।

आपको आश्चर्य नहीं होना चाहिए कि यूटीएफ -8 समस्याएं पैदा कर रहा है; यूटीएफ -8 गैर-ASCII वर्णों को एन्कोड करता है (उदाहरण के लिए उच्चारण लैटिन वर्ण, कांटा, eth, आदि) प्रत्येक BYTES के रूप में।

केवल सामान्य सलाह है कि दिया जा सकता है (सिद्धांत में) काफी सरल है: (1) यह तय करें कि चरित्र सेट आप अपने सिस्टम में (यूनिकोड, लेटिन 1, CP1252, ...) का समर्थन करने के लिए जा रहे हैं (2) यदि आपको किसी अन्य फैशन (जैसे यूटीएफ -8) में एन्कोड किए गए डेटा की आपूर्ति की जा रही है तो सिस्टम सीमा (3) पर इसे अपने मानक (उदाहरण के लिए CP1252) पर ट्रांसकोड करें यदि आपको किसी अन्य फैशन में एन्कोड किए गए डेटा की आपूर्ति करने की आवश्यकता है, तो ..

+1

यूटीएफ -8 चीनी वर्णों के लिए 3 बाइट्स का उपयोग करता है, वास्तव में, और दुर्लभ पात्रों के लिए शायद 4 बाइट की आवश्यकता हो सकती है। यदि आप इसे संबोधित कर रहे हैं तो बेहतर तरीके से इसे ठीक करें। पहला बाइट आपको बताएगा कि कितने लोग अनुसरण करते हैं: 110xxxxx का अर्थ है 2 बाइट चार, 1110xxxx का अर्थ है 3 बाइट चार, और 11110xxx का अर्थ है 4 बाइट चार। – MSalters

+1

यूटीएफ -8 यू + 0800 से यू + एफएफएफएफ के पात्रों के लिए तीन बाइट्स का उपयोग करता है, वास्तव में ... न केवल चीनी को कवर करता है, बल्कि कई देशों/भाषाओं में उपयोग की जाने वाली स्क्रिप्ट: भारत, श्रीलंका, म्यांमार उर्फ ​​बर्मा, थाई, लाओ, तिब्बती, जॉर्जियाई, कोरियाई, इत्यादि। आईस्लैंडिक् में इस्तेमाल किए गए पात्रों से संबंधित "TWO BYTES" का मेरा संदर्भ। अपने होंठ पढ़ें: वह इस बिट को 8 बिट्स से अधिक वर्णों का समर्थन करने के लिए फिर से लिखने वाला नहीं है। तो वह चीनी, अवधि का समर्थन नहीं कर सकता। हांगकांग अपने दुर्लभ गैर-बीएमपी एचकेएससीएस पात्रों के साथ निश्चित रूप से सवाल से बाहर है। –

संबंधित मुद्दे