2011-09-28 9 views
5

मुझे पता है कि सी में एक यूनिकोड चरित्र पाने के लिए ++ मैं कर सकते हैं:सी ++ में यूनिकोड वर्णों को फिर से कैसे करें?

std::wstring str = L"\u4FF0"; 

हालांकि, मैं क्या सीमा 4FF0 5FF0 करने के लिए सभी पात्रों प्राप्त करना चाहते हैं तो क्या होगा? क्या गतिशील रूप से एक यूनिकोड चरित्र बनाना संभव है? मेरे मन में यह कुछ है जो इस छद्म कोड की तरह है:

for (int i = 20464; i < 24560; i++ { // From 4FF0 to 5FF0 
    std::wstring str = L"\u" + hexa(i); // build the unicode character 
    // do something with str 
} 

मैं इसे C++ में कैसे करूं?

उत्तर

9

एक wstring भीतर आयोजित wchar_t प्रकार, एक पूर्णांक प्रकार है, तो आप इसे सीधे उपयोग कर सकते हैं:

for (wchar_t c = 0x4ff0; c <= 0x5ff0; ++c) { 
    std::wstring str(1, c); 
    // do something with str 
} 

0xffff ऊपर पात्रों के साथ ऐसा करने की कोशिश कर सावधान रहें, मंच पर निर्भर करता है के बाद से (जैसे विंडोज) वे wchar_t में फिट नहीं होंगे।

उदाहरण के लिए यदि आप एक स्ट्रिंग में Emoticon block देखना चाहता था, तो आप किराए की जोड़े बना सकते हैं:

std::wstring str; 
for (int c = 0x1f600; c <= 0x1f64f; ++c) { 
    if (c <= 0xffff || sizeof(wchar_t) > 2) 
     str.append(1, (wchar_t)c); 
    else { 
     str.append(1, (wchar_t)(0xd800 | ((c - 0x10000) >> 10))); 
     str.append(1, (wchar_t)(0xdc00 | ((c - 0x10000) & 0x3ff))); 
    } 
} 
+0

क्या कोडपॉइंट्स> 0xffff का कोई आसान समाधान है? –

+1

@ कैप्टन जिराफ, यदि आपका wchar_t प्रकार 16 बिट्स से बड़ा है तो यह कोई समस्या नहीं होगी। अन्यथा आपको [यूटीएफ -16] (http://en.wikipedia.org/wiki/Utf-16) नियमों के अनुसार इसे दो wchar_t वर्णों में तोड़ना होगा। –

+1

यदि कल कल था तो प्रकार को बाइट कहा जाता था, न कि char =) –

2

के बारे में क्या:

for (std::wstring::value_type i(0x4ff0); i <= 0x5ff0; ++i) 
{ 
    std::wstring str(1, i); 
} 

ध्यान दें कि कोड, परीक्षण नहीं किया गया है तो यह संकलन नहीं हो सकता है के रूप में है।

इसके अलावा, wstring की वर्ण इकाई पर काम कर रहे प्लेटफॉर्म को 2, 4, या एन बाइट्स चौड़ा हो सकता है- इसलिए आप इसका उपयोग कैसे करें इसके बारे में जानबूझकर रहें।

+0

'value_type' के साथ' char_type' को प्रतिस्थापित करें और यह संकलित होगा। – Cubbi

+0

@ कब्बी: हो गया, धन्यवाद। – fbrereto

4

आप यूनिकोड वर्ण से अधिक नहीं बढ़ाया जा सकता है, जैसे कि वह एक सरणी है, कुछ अक्षर से बाहर का निर्माण कर रहे हैं एकाधिक 'चार (यूटीएफ -8) और एकाधिक' डब्ल्यूएचएआरएआरएस (यूटीएफ -16) जो डायक्रिटिक्स आदि की वजह से है। यदि आप इस सामान के बारे में वास्तव में गंभीर हैं तो आपको यूनीस्क्रिप्ट या आईसीयू जैसे एपीआई का उपयोग करना चाहिए।

कुछ संसाधनों

पढ़ने के लिए:

http://en.wikipedia.org/wiki/UTF-16/UCS-2

http://en.wikipedia.org/wiki/Precomposed_character

http://en.wikipedia.org/wiki/Combining_character

http://scripts.sil.org/cms/scripts/page.php?item_id=UnicodeNames#4d2aa980

http://en.wikipedia.org/wiki/Unicode_equivalence

http://msdn.microsoft.com/en-us/library/dd374126.aspx

+1

पहला कथन सही है; कारण नहीं है। यूटीएफ -8 और यूटीएफ -16 एन्कोडिंग हैं, और कोड बिंदुओं के लिए ऑर्थोगोनल हैं। डायक्रिटिक्स भी कोड पॉइंट हैं, इसलिए वे यूटीएफ -8 और -16 से भी स्वतंत्र हैं – MSalters

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