2011-11-24 10 views
7

क्या खुले स्रोत सी या सी ++ पुस्तकालय मनमाने ढंग से यूटीएफ -32 से NFC परिवर्तित कर सकते हैं?क्या खुला स्रोत सी या सी ++ पुस्तकालय मनमाने ढंग से यूटीएफ -32 को एनएफसी में परिवर्तित कर सकते हैं?

पुस्तकालय जो मुझे लगता है कि अब तक ऐसा कर सकते हैं: आईसीयू, क्यूटी, जीएलआईबी (सुनिश्चित नहीं है?)।

मुझे किसी अन्य जटिल यूनिकोड समर्थन की आवश्यकता नहीं है; सिर्फ मनमानी लेकिन ज्ञात-सही यूटीएफ -32 से यूटीएफ -32 तक रूपांतरण जो NFC रूप में है।

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

+0

एनएफसी क्या है? यूनिकोड सामान्यीकरण फॉर्म कैनोलिक संरचना? –

+1

@ बिलीओनेल: मुझे पूरा यकीन है कि यह है। Http://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms – wallyk

+1

देखें कि आप कार्यान्वयन विवरणों की परवाह क्यों करते हैं? यदि कोई लाइब्रेरी आंतरिक रूप से यूटीएफ -13 का उपयोग करती है, तो मुझे कोई परवाह नहीं है, जब तक यह सही नतीजे उत्पन्न करता है। – MSalters

उत्तर

2

आईसीयू या Boost.Locale (रैपिंग आईसीयू) बहुत ही लंबे समय से आपका सर्वश्रेष्ठ होगा। सामान्यीकरण मैपिंग अधिक सॉफ़्टवेयर के बराबर होंगे, जो मुझे लगता है कि इस रूपांतरण का बिंदु है।

+0

केवल एक ही संभव (सही) एनएफसी सामान्यीकरण मैपिंग है, इसलिए कोई संगतता चिंता नहीं है, लेकिन मुझे लगता है कि आईसीयू शायद कम से कम छोटी होने की संभावना है। मैं थोड़ी हल्का वजन कम करने की उम्मीद कर रहा था जो सामान्यीकरण कर सकता था, लेकिन मैं बहुत सारे दिखने के बाद, यह तय करना समाप्त कर दिया कि आईसीयू भी सबसे अच्छा विकल्प था, इसलिए मैं इसे स्वीकार करने के रूप में चिह्नित कर रहा हूं। =) – wjl

+0

स्पष्टीकरण के लिए, संगतता से मेरा मतलब हमेशा होता है: 'दोनों पक्षों में एक ही बग्स की संभावना होगी' =) – rvalue

0

आईसीयू पर निर्णय लेने के बाद मैंने जो कोड समाप्त किया, उसका मुख्य भाग यहां दिया गया है। मैंने सोचा कि मुझे इसे यहां रखना चाहिए यदि यह किसी ऐसे व्यक्ति की मदद करता है जो इस बात की कोशिश करता है।

std::string normalize(const std::string &unnormalized_utf8) { 
    // FIXME: until ICU supports doing normalization over a UText 
    // interface directly on our UTF-8, we'll use the insanely less 
    // efficient approach of converting to UTF-16, normalizing, and 
    // converting back to UTF-8. 

    // Convert to UTF-16 string 
    auto unnormalized_utf16 = icu::UnicodeString::fromUTF8(unnormalized_utf8); 

    // Get a pointer to the global NFC normalizer 
    UErrorCode icu_error = U_ZERO_ERROR; 
    const auto *normalizer = icu::Normalizer2::getInstance(nullptr, "nfc", UNORM2_COMPOSE, icu_error); 
    assert(U_SUCCESS(icu_error)); 

    // Normalize our string 
    icu::UnicodeString normalized_utf16; 
    normalizer->normalize(unnormalized_utf16, normalized_utf16, icu_error); 
    assert(U_SUCCESS(icu_error)); 

    // Convert back to UTF-8 
    std::string normalized_utf8; 
    normalized_utf16.toUTF8String(normalized_utf8); 

    return normalized_utf8; 
} 
संबंधित मुद्दे