2010-09-15 8 views
5

मेरे पास एक साधारण सवाल है कि मुझे इंटरनेट पर कहीं भी नहीं मिल रहा है, मैं यूटीएफ -8 को ASCII में परिवर्तित कैसे कर सकता हूं (ज्यादातर उच्चारण वाले अक्षरों को उच्चारण में बिना किसी चरित्र के) केवल मानक lib का उपयोग कर? मुझे वहां की अधिकांश भाषाओं का समाधान मिला, लेकिन विशेष रूप से सी के लिए नहीं।यूटीएफ -8 -> सी भाषा में ASCII

धन्यवाद!

संपादित करें: टिप्पणी करने वाले कुछ लोगों ने मुझे दोबारा जांच की और मुझे अतिरंजित किया। मुझे केवल एक फ़ंक्शन बनाने के बारे में एक विचार चाहिए जो करता है: उच्चारण के साथ char -> बिना उच्चारण के char। :)

+0

यह मानक पुस्तकालय में नहीं है, इसलिए आपको यह निर्दिष्ट करना चाहिए कि आपको वास्तव में किस प्लेटफ़ॉर्म के लिए काम करने की आवश्यकता है। –

+0

शायद लिनक्स। – dccarmo

+1

@dccarmo - सी मानक उदाहरण नहीं है Posix मानक। लिनक्स पर उपलब्ध होने के नाते, या यहां तक ​​कि पॉज़िक्स द्वारा अनिवार्य होने के कारण, यह * सी * मानक पुस्तकालय नहीं बनाता है। – Steve314

उत्तर

2

ऐसा करने के तरीके में कोई भी निर्मित नहीं है। यूटीएफ -8 और एएससीआईआई के बीच वास्तव में थोड़ा अंतर नहीं है जब तक कि आप उच्च स्तरीय पात्रों के बारे में बात नहीं कर रहे हैं, जिसे किसी भी तरह एएससीआईआई में प्रदर्शित नहीं किया जा सकता है।

यदि आपके पास एक विशिष्ट मैपिंग है जो आप चाहते हैं (जैसे उच्चारण के साथ -> ए) तो आपको शायद स्ट्रिंग को प्रतिस्थापन के रूप में संभालना चाहिए।

+0

लेकिन जब मैं एक (सी == 'á') {सी = 'ए' करने की कोशिश करता हूं; } यह मुझे देता है "डेटा प्रकार की सीमित सीमा के कारण तुलना हमेशा झूठी होती है" :( – dccarmo

+0

@dccarmo: ''á'' को' '\ 0703 \ 0120'' जैसा दिखता है, इसलिए यह स्थिर है जो कि बड़ा है एक 'char' हो सकता है, इसलिए यदि 'सी' एक char है तो उसके बराबर बराबर होने का कोई तरीका नहीं है। यह बराबर होने की संभावना है \ '703'' और आपकी स्ट्रीम में अगला अक्षर' '\ 0120''। – nategoose

+0

@nategoose: उन प्रमुख शून्यों को हटाएं; वे सी octal char escapes में मान्य नहीं हैं। \ 0703 \ 0120' को '\ 070',' 3', '\ 012' के रूप में पार्स किया गया है,' 0' –

5

libiconv पर एक नज़र डालें। यहां तक ​​कि यदि आप पुस्तकालयों के बिना इसे करने पर जोर देते हैं, तो आपको वहां एक प्रेरणा मिल सकती है।

+0

मेरा मानना ​​है कि "केवल मानक lib का उपयोग करके" –

+0

@ बिली का उल्लंघन करता है - न कि केवल एक व्यक्ति libiconv स्रोतों को पढ़ता है (उदाहरण के लिए कोड श्रेणियों की प्रतिलिपि बनाने के लिए)। – Steve314

+0

मैं इसे एक नज़र दूंगा, धन्यवाद! – dccarmo

4

सामान्य रूप से, आप नहीं कर सकते। यूटीएफ -8 उच्चारण वाले पात्रों से कहीं अधिक है।

2

प्रत्येक सभ्य यूनिकोड समर्थन पुस्तकालय (पाठ्यक्रम की मानक लाइब्रेरी नहीं) केसी या केडी रूप में एक स्ट्रिंग को विघटित करने का एक तरीका है। जो अक्षरों से अक्षरों को अलग करता है। उन्हें फ़िल्टर करने पर आपको एक शॉट दे रहा है। इतना यकीन नहीं है कि यह पीछा करने लायक है, नतीजा सिर्फ मूल भाषा पाठक के लिए अस्पष्ट है और हर पत्र विघटनकारी नहीं है। दूसरे शब्दों में, प्रश्न चिह्न के साथ जंक।

+0

हाँ, मैं अपने प्रश्न पर अतिरंजित हूं। मैं वास्तव में उच्चारण किए बिना चार -> char उच्चारण उच्चारण करना चाहता हूं। मैं अपने शिक्षक से नफरत करता हूं कि हम केवल मानक lib और सी में भी ऐसा करने की अनुमति दें। अगर मैं केवल पायथन का उपयोग कर सकता हूं। :( – dccarmo

+2

आपने गलत वर्ग चुना है, जो आपकी मदद नहीं कर सकता है। –

2

चूंकि यह गृहकार्य है, मैं अनुमान लगा रहा हूं कि आपका शिक्षक अनजान है और यूटीएफ -8 के बारे में कुछ भी नहीं जानता है, और शायद 1 9 80 के दशक में "कोड पेज" और "विस्तारित ASCII" के साथ अटक गया है (शब्दों को मिटा देना चाहिए यदि आपके पास पहले से नहीं है तो अपनी शब्दावली से)। आपका शिक्षक शायद आपको एक 128-बाइट लुकअप टेबल लिखना चाहता है जो सीपी 437 या विंडोज -1252 बाइट्स को 128-255 रेंज में समान दिखने वाले ASCII अक्षरों में दिखाता है। यह कुछ ऐसा होगा ...

void strip_accents(unsigned char *dest, const unsigned char *src) 
{ 
    static const unsigned char lut[128] = { /* mapping here */ }; 
    do { 
     *dest++ = *src < 128 ? *src : lut[*src]; 
    } while (*src++); 
} 
संबंधित मुद्दे