जब मैंने जावास्क्रिप्ट "Ł" > "Z"
में लिखा था तो यह true
देता है। यूनिकोड ऑर्डर में यह निश्चित रूप से false
होना चाहिए। इसे कैसे ठीक करें? मेरी साइट यूटीएफ -8 का उपयोग कर रही है।जावास्क्रिप्ट में यूनिकोड तारों की तुलना कैसे करें?
उत्तर
आप Intl.Collator
या String.prototype.localeCompare
, ECMAScript Internationalization API द्वारा शुरू उपयोग कर सकते हैं:
"Ł".localeCompare("Z", "pl"); // -1
new Intl.Collator("pl").compare("Ł","Z"); // -1
-1
मतलब यह है कि Ł
, Z
से पहले आता है की तरह आप चाहते हैं।
ध्यान दें कि यह केवल नवीनतम ब्राउज़र पर काम करता है।
आप localeCompare()
का उपयोग करके अपना खुद का सॉर्टिंग फ़ंक्शन बनाने में सक्षम हो सकते हैं - कम से कम MDC article on the topic के अनुसार - चीजों को सही तरीके से सॉर्ट करना चाहिए।
यदि यह काम नहीं करता है, तो यहां एक interesting SO question है जहां ओपी "ब्रूट-फोर्स" सॉर्टिंग तंत्र बनाने के लिए स्ट्रिंग प्रतिस्थापन को नियोजित करता है।
इसके अलावा, ओपी दिखाता है कि ओपी दिखाता है कि jQuery टेबललेटर प्लगइन के लिए a custom textExtract
function कैसे बनाया जाए जो लोकेल-जागरूक सॉर्टिंग करता है - शायद एक लुक के लायक भी हो।
संपादित करें: एक पूरी तरह से दूर बाहर विचार के रूप में - मुझे नहीं पता कि क्या यह सब पर संभव है खासकर इसलिए प्रदर्शन चिंताओं में से है, - अगर आप PHP के साथ काम कर रहे हैं/बैक-एंड पर mySQL वैसे भी, मैं करूंगा एक myxQL उदाहरण को अजाक्स क्वेरी भेजने की संभावना का उल्लेख करना पसंद है ताकि इसे वहां हल किया जा सके। mySQL लोकेल जागरूक डेटा को सॉर्ट करने में बहुत अच्छा है, क्योंकि आप सॉर्टिंग ऑपरेशंस को एक विशिष्ट संयोजन में लागू कर सकते हैं उदा। ORDER BY xyz COLLATE utf8_polish_ci
, COLLATE utf8_german_ci
.... उन collations एक ही समय में सभी सॉर्टिंग दुःखों का ख्याल रखेगा।
var alpha = function(alphabet, dir, caseSensitive){
return function(a, b){
var pos = 0,
min = Math.min(a.length, b.length);
dir = dir || 1;
caseSensitive = caseSensitive || false;
if(!caseSensitive){
a = a.toLowerCase();
b = b.toLowerCase();
}
while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; }
return alphabet.indexOf(a.charAt(pos)) > alphabet.indexOf(b.charAt(pos)) ?
dir:-dir;
};
};
a
तार की एक सरणी पर इसका इस्तेमाल करने के लिए::
a.sort(
alpha('ABCDEFGHIJKLMNOPQRSTUVWXYZaàâäbcçdeéèêëfghiïîjklmnñoôöpqrstuûüvwxyÿz')
);
रूप 1
या -1
जोड़े
Thx। लिंक के लिए। यह बहुत शर्म की बात है कि जावास्क्रिप्ट कोर में इसका समर्थन नहीं करता है, लेकिन फिर भी यह काम कर रहा है। –
आईई 6 में 'लोकेल कॉम्पारे()' से सावधान रहें: http://blog.schmichael.com/2008/07/14/javascript-collation-fail/ – BalusC
@ बालससी उस लेख में टिप्पणियों का दावा है कि यह वास्तव में शराब की गलती है, आईई 6 नहीं है। इस मुद्दे पर पुष्टि करने या अस्वीकार करने के लिए इस मुद्दे पर कुछ और नहीं मिल रहा है, और मैं अभी एक टेस्ट केस बनाने के लिए बहुत आलसी हूं ... @ टॉमसज़ अगर आप इस मार्ग पर जाते हैं, तो यह सुनना दिलचस्प होगा कि चीजें अच्छी तरह से काम करती हैं या नहीं IE6। –
यहाँ फ्रेंच वर्णमाला कि आप एक कस्टम प्रकार के लिए मदद कर सकता है के लिए एक उदाहरण है आरोही या अवरोही क्रमबद्ध करने के लिए alpha()
का दूसरा पैरामीटर।
केस संवेदनशील होने के लिए 3 पैरामीटर के रूप में true
जोड़ें।
आप वर्णमाला सूची
यदि आप इस कोड का उपयोग कर रहे हैं, तो यह भी देखें: http://stackoverflow.com/questions/3630645/how-to-compare-utf-8-strings-in-javascript/3633725#3633725 –
ईक! क्या आपको वास्तव में उन सभी के माध्यम से जाना है? इसे सामान्यीकरण फॉर्म डी में पहले रखने के बारे में क्या? क्या PHP में वास्तव में पर्ल के [यूनिकोड :: कोलेट] (http://search.cpan.org/perldoc?Unicode%3A%3ACollate) के बराबर कुछ नहीं है और [यूनिकोड :: कोलेट :: लोकेल] (http: // search। cpan.org/perldoc?Unicode%3A%3ACollate%3A%3ALocale) मॉड्यूल? ** वास्तव में? ** ऐसा लगता है कि किसी के अपने आप को फिर से लागू करने की कोशिश करने के लिए पूर्ण पागलपन की तरह लगता है! – tchrist
@ क्रिसमस, यह PHP नहीं है, लेकिन यहां जावास्क्रिप्ट है, और ऐसा ही है। – Mic
माइक के कोड गैर उल्लेख वर्ण के लिए सुधार करने के लिए संख्या और विशेष वर्ण जोड़ने की जरूरत हो सकता है:
var alpha = function(alphabet, dir, caseSensitive){
dir = dir || 1;
function compareLetters(a, b) {
var ia = alphabet.indexOf(a);
var ib = alphabet.indexOf(b);
if(ia === -1 || ib === -1) {
if(ib !== -1)
return a > 'a';
if(ia !== -1)
return 'a' > b;
return a > b;
}
return ia > ib;
}
return function(a, b){
var pos = 0;
var min = Math.min(a.length, b.length);
caseSensitive = caseSensitive || false;
if(!caseSensitive){
a = a.toLowerCase();
b = b.toLowerCase();
}
while(a.charAt(pos) === b.charAt(pos) && pos < min){ pos++; }
return compareLetters(a.charAt(pos), b.charAt(pos)) ? dir:-dir;
};
};
function assert(bCondition, sErrorMessage) {
if (!bCondition) {
throw new Error(sErrorMessage);
}
}
assert(alpha("bac")("a", "b") === 1, "b is first than a");
assert(alpha("abc")("ac", "a") === 1, "shorter string is first than longer string");
assert(alpha("abc")("1abc", "0abc") === 1, "non-mentioned chars are compared as normal");
assert(alpha("abc")("0abc", "1abc") === -1, "non-mentioned chars are compared as normal [2]");
assert(alpha("abc")("0abc", "bbc") === -1, "non-mentioned chars are compared with mentioned chars in special way");
assert(alpha("abc")("zabc", "abc") === 1, "non-mentioned chars are compared with mentioned chars in special way [2]");
अजीब बात है, मुझे लगता है कि समस्या के बारे में सोचना और यहाँ खोज समाप्त हो गया , क्योंकि यह दिमाग में आया, कि मैं अपने स्वयं के जावास्क्रिप्ट मॉड्यूल का उपयोग कर सकता हूं। मैं एक साफ यूआरएल उत्पन्न करने के लिए, की वजह मैं इनपुट स्ट्रिंग translitate करने के लिए है ... (http://pid.github.io/speakingurl/)
var mySlug = require('speakingurl').createSlug({
maintainCase: true,
separator: " "
});
var input = "Schöner Titel läßt grüßen!? Bel été !";
var result;
slug = mySlug(input);
console.log(result); // Output: "Schoener Titel laesst gruessen bel ete"
अब आप सॉर्ट कर सकते हैं इस के साथ परिणाम एक मॉड्यूल लिखा था। आप पूर्व कर सकते हैं MySlug के परिणाम के साथ "title_sort" में सॉर्ट करने के लिए फ़ील्ड "शीर्षक" और फ़ील्ड में मूल शीर्षक को स्टोर करें।
यह लगभग अच्छा समाधान है। समस्या यह है कि "ä" को "ए" के साथ मिश्रित किया जाएगा, लेकिन इसे अलग किया जाना चाहिए। –
आप वास्तव में क्या करने की कोशिश कर रहे हैं? शायद कामकाज हैं। –
मैं उपयोगकर्ता नामों के आधार पर तालिका को सॉर्ट करने का प्रयास कर रहा हूं और मेरे पास "Ł" जैसे अक्षर हैं। –
दूसरे शब्दों में, यह 'एल' के ठीक बाद आना चाहिए? अर्थात। '..J, K, L, L, M, एन, O..'? – BalusC