2011-12-20 19 views
5

से हस्ताक्षरित चार कैसे बनाएं I C++ लाइब्रेरी के साथ काम कर रहा हूं, और एक यूटीएफ -8 कोड बिंदु से एक हस्ताक्षरित char बनाने की आवश्यकता है। उदाहरण के लिए, यदि कोड बिंदु decimal 610 (एक 'लैटिन अक्षर छोटी पूंजी जी' है), तो मैं इसे C++ में कैसे बनाऊंगा?सी ++: यूटीएफ -8 कोड बिंदु

मैं जावास्क्रिप्ट, मैं निम्नलिखित कर सकते हैं:

var temp = String.fromCharCode(610); 
console.log(temp); // Outputs a small 'G' (correct) 
var codePoint = temp.charCodeAt(0); 
console.log(codePoint); // Outputs 610 (correct) 

C++ में की कोशिश की है:

unsigned char temp = (unsigned char)610; 
// compiles, but 
Debug::WriteLine((int)temp); // outputs 98 (??) 

कृपया सी में एक कोड उदाहरण ++ जो ऊपर जावास्क्रिप्ट उदाहरण के रूप में ही करता है प्रदान करते हैं।

पर्यावरण प्रबंधित सी ++ में है, लेकिन मैं सीएलआर प्रकारों का उपयोग करना टालना चाहता हूं क्योंकि मैं किसी तृतीय पक्ष लाइब्रेरी के साथ इंटरफेसिंग कर रहा हूं।

+0

'Debug' के प्रकार क्या है? क्या डीबग यूटीएफ को पहचानता है? क्योंकि सी ++ ostreams नहीं है। यूटीएफ, विशेष रूप से यूटीएफ 8 के साथ आपको बहुत कुछ करने के लिए पुस्तकालय की आवश्यकता है। –

+0

'हस्ताक्षरित चार' केवल 255 तक मान रखने की गारंटी है; एक यूनिकोड कोडपॉइंट बहुत बड़ा हो सकता है। आपकी समस्या अच्छी तरह से नहीं कहा गया है। –

+0

आह, अगर ऐसा करना संभव था तो जीवन इतना आसान होगा ..... –

उत्तर

5

एक unsigned char (, यह मानते हुए एक चार 8 बिट व्यापक है यह केवल 0 से 255 मान हो सकते हैं) 610 का एक मूल्य धारण करने के लिए छोटा सा करने के लिए है, तो यह wrap around *

उपयोग char16_t एक 16 स्टोर करने के लिए होगा -बिट चार (या char32_t 32-बिट चार के लिए, जो यूटीएफ -8 की आवश्यकता है)।

char32_t temp = (char32_t)610; 
Debug::WriteLine(temp); // outputs 610 (!!) 

आपको UTF-8 तार, उपयोग UTF-8 स्ट्रिंग शाब्दिक संभाल करना चाहते हैं:

u8"I'm a UTF-8 string." 

* यह अपने उदाहरण में भी दो बार लपेट होगा:

610 - 256 - 256 = 98

+0

ध्यान दें कि 'char16_t' और' char32_t' का उपयोग यहां _codepoints_ के रूप में किया जा रहा है। –

+0

@MooingDuck, आप यह उल्लेख करना भूल गए कि 'char16_t' प्रत्येक कोडपॉइंट को पकड़ने के लिए पर्याप्त रूप से बड़ा नहीं है और उस उद्देश्य के लिए टालना चाहिए। विंडोज़ द्वारा आवश्यक यूटीएफ -16 को पकड़ने के लिए 'char16_t' की एक स्ट्रिंग का उपयोग किया जा सकता है। –

3

यूनिकोड कोड पॉइंट्स को 32 बिट प्रस्तुतियों की आवश्यकता हो सकती है। अधिकांश पश्चिमी भाषाओं में, 16 बिट पर्याप्त हैं, लेकिन सभी संभावित यूनिकोड कोड बिंदुओं को संभालने के लिए, आपको वास्तव में 32 बिट्स की आवश्यकता होती है।

uint32_t codePoint = someString.CodePointAt(x); 

आप इसे यहाँ के बारे में अधिक पढ़ सकते हैं: http://en.wikipedia.org/wiki/Code_point

+0

यूनिकोड 21 बिट्स तक उपयोग करता है।कोई संख्यात्मक डेटा प्रकार नहीं है जो डेटा के 17-31 बिट्स का प्रतिनिधित्व कर सकता है, इसलिए आपको डेटा के 21 बिट्स का प्रतिनिधित्व करने के लिए 32-बिट संख्यात्मक प्रकार की आवश्यकता है। –

0

तुम्हारा मतलब क्या आप कर सकता है यूनिकोड कोड बिंदु 610 के लिए UTF-8 प्रतिनिधित्व करने के लिए एक अहस्ताक्षरित चार इशारा बनाना चाहते हैं:

char unsigned temp[] = { 0xc9, 0xa2 }; 
संबंधित मुद्दे