के लिए केस-असंवेदनशील यूटीएफ -8 स्ट्रिंग कॉलेशन मैं custom collation function in SQLite में इसका उपयोग करने के लिए केस-असंवेदनशील तरीके से सी ++ में यूटीएफ -8 स्ट्रिंग्स की तुलना और सॉर्ट करने की विधि ढूंढ रहा हूं।SQLite (सी/सी ++)
- विधि आदर्श लोकेल-स्वतंत्र होना चाहिए। हालांकि, जहां तक मुझे पता है, मैं अपनी सांस नहीं पकड़ूंगा, संयोजन बहुत भाषा-निर्भर है, इसलिए अंग्रेजी के अलावा अन्य भाषाओं पर जो कुछ भी काम करता है, वह भी होगा, भले ही इसका मतलब स्थानीय लोगों को स्विच करना है।
- विकल्प मानक सी या सी ++ लाइब्रेरी या छोटे (एम्बेडेड सिस्टम के लिए उपयुक्त) और गैर जीपीएल (एक मालिकाना प्रणाली के लिए उपयुक्त) तृतीय-पक्ष लाइब्रेरी का उपयोग कर सकते हैं।
क्या मैं अब तक है:
strcoll
सी स्थानों के साथ औरstd::collate
/std::collate_byname
केस-संवेदी होते। (वहाँ इनमें से केस-संवेदी संस्करणों हैं?)मैं एक POSIX strcasecmp का उपयोग करने की कोशिश की है, लेकिन यह
"POSIX"
POSIX स्थान में, strcasecmp के अलावा अन्य स्थानों के लिए not defined हो रहा है() और strncasecmp() ऊपरी रूपांतरणों के ऊपरी भाग में, फिर एक बाइट तुलना करें। परिणाम अन्य लोकेशंस में निर्दिष्ट नहीं हैं।
और, वास्तव में,
strcasecmp
का परिणाम glibc साथ लिनक्स पर स्थानों के बीच नहीं बदलता है।#include <clocale> #include <cstdio> #include <cassert> #include <cstring> const static char *s1 = "Äaa"; const static char *s2 = "äaa"; int main() { printf("strcasecmp('%s', '%s') == %d\n", s1, s2, strcasecmp(s1, s2)); printf("strcoll('%s', '%s') == %d\n", s1, s2, strcoll(s1, s2)); assert(setlocale(LC_ALL, "en_AU.UTF-8")); printf("strcasecmp('%s', '%s') == %d\n", s1, s2, strcasecmp(s1, s2)); printf("strcoll('%s', '%s') == %d\n", s1, s2, strcoll(s1, s2)); assert(setlocale(LC_ALL, "fi_FI.UTF-8")); printf("strcasecmp('%s', '%s') == %d\n", s1, s2, strcasecmp(s1, s2)); printf("strcoll('%s', '%s') == %d\n", s1, s2, strcoll(s1, s2)); }
यह छपा है:
strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == -32 strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == 7 strcasecmp('Äaa', 'äaa') == -32 strcoll('Äaa', 'äaa') == 7
पुनश्च
और हाँ, मैं ICU के बारे में जानकारी है, लेकिन हम अपने enormous size की वजह से एम्बेडेड मंच पर उपयोग नहीं कर सकते ।
जर्मन "ß" चरित्र (और ऐसे सभी प्रचुर मात्रा में मामलों) के साथ आपके उदाहरण के बारे में: इन्हें "हल" किया जाना चाहिए या अन्यथा यूटीएफ -8 या नहीं, इससे पहले हजारों बार निपटाया जाना चाहिए। एमएस वर्ड में हमेशा "टॉगल केस" सुविधा होती है - यह उस चरित्र पर प्री-यूनिकोड संस्करणों में कैसे काम करता है? WordPerfect कैसे किया? मुझे ओपी के समान समस्या है, सिवाय इसके कि मैं डेल्फी में काम करता हूं। मैंने कई विंडोज़ स्क्लाइट-आधारित ऐप्स देखे हैं जो एक केस-असंवेदनशील चयन (और मुझे लगता है कि ऑर्डर करें), चाहे वे एक अंग्रेजी, जर्मन या (मेरे मामले में) पोलिश लोकेल में स्थापित हों। फ़ायरफ़ॉक्स आज़माएं :) वे ऐसा कैसे करते हैं? –
आमतौर पर गलत :) पोलिश में आईआईआरसी कोई कठिन मामला नहीं है; पोलिश में उपयोग किए जाने वाले सभी गैर-ASCII वर्ण "ASCII वर्णों" पर आधारित होते हैं। – MSalters
तुर्की I समस्या के अलावा, यूनिकोड केस फोल्डिंग एल्गोरिदम (http://www.unicode.org/reports/tr44/) उल्लेखनीय रूप से अच्छी तरह से काम करता है। – dalle