2011-05-29 10 views
5

का उपयोग करने के लिए कुछ स्कैनर कोड अपडेट करते समय प्रश्न मैं एक प्राथमिक हाथ से कोडित लेक्सिकल स्कैनर पर काम कर रहा हूं और यूटीएफ -8 इनपुट का समर्थन करना चाहता हूं (यह अब 1 9 70 नहीं है!)। इनपुट वर्ण stdin या एक समय में फ़ाइल एक से पढ़े जाते हैं और व्हाइटस्पेस दिखाई देने तक एक बफर में धकेलते हैं। मैंने fgetc() के लिए अपना स्वयं का रैपर लिखने के बारे में सोचा था जो इसके बजाय यूटीएफ -8 चरित्र बनाने वाले बाइट्स के char[] लौटाएगा और एक स्ट्रिंग के रूप में परिणाम के साथ काम करें ... यह काफी आसान होगा, लेकिन एक फिसलन-ढलान बन जाएगा। मैं पहिया को पुन: आविष्कार करने का समय बर्बाद नहीं करना चाहूंगा और इसके बजाय ICU जैसी मौजूदा, परीक्षण लाइब्रेरी का उपयोग करूंगा। और इसलिए अब मेरे पास एक गैर-यूटीएफ -8 सहायक कोड है जो fgetc(), isspace(), strcmp() आदि के साथ काम करता है, जिसे मैं आईसीयू का उपयोग करने के लिए अद्यतन करने का प्रयास कर रहा हूं। यह आईसीयू के साथ मेरा पहला प्रयास है और दस्तावेज के माध्यम से पढ़ रहा है और Google कोड खोज के साथ उपयोग उदाहरण खोजने की कोशिश कर रहा है, लेकिन अभी भी भ्रम के कुछ बिंदु हैं, मुझे उम्मीद है कि कोई स्पष्टीकरण देने में सक्षम होगा।आईसीयू

u_fgetc() फ़ंक्शन UChar, और u_fgetcx() रिटर्न UChar32 ... प्रलेखन कोड पॉइंट्स को पढ़ने के लिए u_fgetcx() उपयोग करने की सलाह है, ताकि मैं क्या कर रहा हूँ के साथ शुरू है। मैं ऊपर जैसा ही दृष्टिकोण रख रहा हूं, लेकिन मैं UChar32 एस को char एस के बजाय बफर में दबा रहा हूं।

  • ज्ञात मूल्य के विरुद्ध किसी चरित्र की तुलना करने का उचित तरीका क्या है? मूल रूप से मैं इनपुट से प्लस-साइन प्राप्त किया गया था या नहीं, यह जांचने के लिए if (c == '+') करने में सक्षम था। जीसीसी शिकायत नहीं करता है जब cUChar32 है (जो तब UChar32 और char के बीच तुलना करता है) लेकिन क्या यह वास्तव में उचित है?

  • मैं strcmp() का उपयोग ज्ञात मान के साथ buffered वर्णों की तुलना करने के लिए करने में सक्षम था, उदाहरण के लिए if ((strcmp(buf, "else") == 0)। आईसीयू द्वारा प्रदान किए गए u_strcmp() और मुझे लगता है कि ज्ञात शाब्दिक निर्दिष्ट करने के लिए मुझे U_STRING_DECL और U_STRING_INIT मैक्रोज़ का उपयोग करने की आवश्यकता हो सकती है, लेकिन मुझे निश्चित नहीं है। प्रलेखन से पता चलता है कि वे UChar[] में परिणाम देते हैं, हालांकि मुझे लगता है कि मुझे UChar32[] की आवश्यकता है ... और मुझे अनिश्चितता है कि वैसे भी उनका उपयोग कैसे करें। यहां कोई मार्गदर्शन का स्वागत किया जाएगा।

  • संख्यात्मक वर्णों की एक श्रृंखला में पढ़ने के बाद मैं उन्हें strtol() के साथ परिवर्तित कर रहा हूं ताकि मैं उनके साथ काम कर सकूं। क्या आईसीयू द्वारा एक समान कार्य उपलब्ध कराया गया है क्योंकि मैं अब UChar32[] परिवर्तित कर रहा हूं? जबकि UChar32 एक कोड प्वाइंट आयोजित करने के लिए है

उत्तर

5

UChar, एक कोड यूनिट आयोजित करने के लिए है। यदि आपका इनपुट Basic Multilingual Plane (बीएमपी) पर रहता है, UChar पर्याप्त है, और वास्तव में अधिकांश आईसीयू फ़ंक्शन UChar[] पर संचालित होते हैं।

मजबूत अनुशंसित पढ़ने ICU User Guide है, जो आंतरिक और सर्वोत्तम प्रथाओं में से अधिकांश को बताती है।

  • ज्ञात मान के खिलाफ एक यूनिकोड वर्ण चर तुलना करने के लिए उचित तरीका क्या है? एक वर्ण (या UChar या UChar32) एक निश्चित चौड़ाई और हस्ताक्षर के साथ एक और पूर्णांक प्रकार है, और सामान्य गुफाओं और प्रतिबंधों के साथ अन्य पूर्णांक प्रकारों की तुलना की जा सकती है।\u चार हेक्स अंक, या \U आठ हेक्स अंक के बाद के बाद, आईएसओ/आईईसी 10646 "संक्षेप पहचानकर्ता" निर्दिष्ट: को परिभाषित करने एक चरित्र मूल्य के लिए के रूप में, C99 (अध्याय 6.4.3) यूनिवर्सल चरित्र नाम अंकन प्रदान करता है। 0x00a0 से नीचे का क्षेत्र (0x0024 '$', 0x0040 '@', और 0x0060 (बैकटिक) के अपवादों के साथ आरक्षित है (लेकिन UChar पर एक साधारण चरित्र स्थिरांक कास्टिंग करके इसका प्रतिनिधित्व किया जा सकता है)। 0xd800 से 0xdfff तक की सीमा भी है (यूटीएफ द्वारा उपयोग के लिए -16)।

  • कैसे यूनिकोड स्ट्रिंग शाब्दिक परिभाषित करने के लिए?U_STRING_DECL और U_STRING_INIT आप के लिए वास्तव में क्या चाहते हैं कर रहे हैं। (जैसा कि ऊपर लिखा, आईसीयू मुख्य रूप से UChar[] पर चल रही है।) आप सी ++ सी का उपयोग कर के बजाय कर रहे थे , UNICODE_STRING_SIMPLE (वैकल्पिक रूप से getTerminatedBuffer() के बाद UChar[] उपज के लिए) यूनिकोड स्ट्रिंग अक्षर को परिभाषित करने का एक और अधिक आरामदायक तरीका प्रदान करता है।

  • यूनिकोड स्ट्रिंग को उस संख्यात्मक मूल्य में संख्यात्मक प्रतिनिधित्व करने के लिए कैसे परिवर्तित करें?unum_parse() और unum.h में इसके भाई आपकी मदद करेंगे।

+0

ग्रेट प्रतिक्रियाएं, मैं सिर्फ अन्य पाठकों के लिए जोर दूंगा: यूनिकोड में अपनी तुलना करें, न कि char * s के रूप में। (इसलिए "x" या 'x' का उपयोग न करें)। अन्यथा आप कोडपेज मुद्दों में भाग सकते हैं। –

2
  1. प्लस पर हस्ताक्षर के लिए यूनिकोड मूल्य U + 002B है, और '+' के लिए सामान्य (लैटिन -1) मूल्य भी 0x2B (053, 43) है। आपने जो लिखा है वह पर्याप्त सुरक्षित है जहां कोड सेट ASCII या ISO-8859-x पर आधारित है। सी 99 मानक फॉर्म \u0123 और \U00102345 (4 और 8 हेक्साडेसिमल अंकों के साथ) के यूनिकोड (सार्वभौमिक चरित्र नाम) प्रदान करता है, लेकिन यह निर्धारित करता है कि आप \u00A0 से कम मान निर्दिष्ट नहीं कर सकते हैं, जैसे \u002B। तो, मुझे लगता है कि आपने जो लिखा है वह सही है।

    हालांकि, आप अपने आप को उपयोग करके भविष्य की चिंता को बचा सकता है एक enum ऐसे

    enum { PLUS_SIGN = '+' }; 
    

    एक उपयुक्त हेडर में निर्धारित और इस्तेमाल किया जहाँ आप एक शाब्दिक धन चिह्न के रूप में की जरूरत है। इस तरह, यदि आपकी धारणा (और मेरी धारणा) गलत है, तो आपके पास हेडर को संपादित करने के लिए एक स्थान है।

    मुझे लगता है कि आईसीयू के साथ Strings पर पृष्ठ से पता चलता है कि एप्लिकेशन में यूटीएफ -32 का उपयोग करना असामान्य है।

  2. शुद्ध सी में, आप शायद wcscmp(buf, L"else") का उपयोग करेंगे, यह सोचते हैं कि आपके सिस्टम पर wchar_tuint32_t और/या UChar32 के बराबर है। यूटीएफ -32 स्ट्रिंग बनाने के लिए UnicodeString और UNICODE_STRING("...") का उपयोग करने के बाद ToUTF32() का उपयोग करने के तरीके प्रतीत होते हैं। साफ-सुथरे तरीके भी हो सकते हैं।

  3. 'स्वरूपण' वर्ग हैं जो स्वरूपण और पार्सिंग दोनों को संभालते हैं। आप शायद NumberFormat कक्षा से व्युत्पन्न कक्षाओं का उपयोग करेंगे।

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