ग्लिब के कई अलग-अलग संस्करणों पर परीक्षण किए गए सभी यूनिकोड लोकेशंस में किसी कारण से, strcoll() किसी भी दो के लिए शून्य देता है hiraganas। यह सॉर्ट, uniq, और कुछ भी जो किसी भी तरह से स्ट्रिंग के ऑर्डर के साथ इंटरैक्ट करता है।
$ echo -e -n 'い \ n ろ \ n は \ n に \ n ほ \ n へ \ n と \ n' | सॉर्ट | uniq
い
जो केवल मरम्मत के परे टूट गया है। दुनिया के विभिन्न स्थानों के लोगों के पास अलग-अलग विचार हो सकते हैं कि 'い' को 'ろ' के पहले या बाद में रखा जाना चाहिए, लेकिन कोई भी उन्हें समझ नहीं पाएगा।
और कोई, जापानी एक करने के लिए अपने स्थान की स्थापना कोई फर्क नहीं पड़ता:
$ LC_ALL = ja_JP.utf8 LANG = ja_JP.utf8 LC_COLLATE = ja_jp।utf8 echo -e -n 'い \ n ろ \ n は \ n に \ n ほ \ n へ \ n と \ n' | सॉर्ट | uniq
い
कुछ सरकारी मेलिंग सूची में चर्चा हुई थी, लेकिन लगता है क्या, यह 2002 में था और यह तय नहीं किया गया है क्योंकि लोगों को परवाह नहीं है: https://www.mail-archive.com/[email protected]/msg02658.html
बग को क्या हुआ कि हमें कुछ दिनों में और अंत में कोलाइट लोकेल को "सी" में सेट करने और यूटीएफ -8 एन्कोडिंग के अच्छे गुणों पर भरोसा करने का हमारा एकमात्र तरीका था। यह एक भयानक अनुभव है, क्योंकि सभी जापानी डेटा को संसाधित करते समय वास्तव में "सी" लोकेल के तहत काम नहीं करना चाहिए।
तो अपनी स्वच्छता के लिए, सीधे स्ट्रोक का उपयोग न करें। का अधिक सुरक्षित संस्करण हो सकता है:
int safe_strcoll(const char *a, const char *b)
{
int ret = strcoll(a, b);
if (ret != 0) return ret;
return strcmp(a, b);
}
सिर्फ मामले strcoll में() आप पेंच का निर्णय लेता है ...
स्रोत
2016-07-31 14:05:47
[यहाँ उदाहरण] (http://en.cppreference.com/w/cpp/string/बाइट/स्ट्रोकॉल) मेरी राय में बहुत स्पष्ट लगता है। – Rapptz
@ रैपेटज़ ... ओह ... उस लिंक को देखना चाहिए .... पोस्ट करने से पहले ... – Recker
hrnec chrt से पहले :) +1 – davak