दिलचस्प पोस्ट
एंड्रॉइड एसडीके के साथ मल्टीपार्ट अनुरोध पोस्ट करें मुद्राओं के साथ काम करने के लिए बिगडीक्वेल का उपयोग करना Urllib2.urlopen पर उपयोगकर्ता एजेंट बदलना QML और सी + + छवि अंतर MySQL में एकाधिक तालिकाओं से कैसे हटाना है? फैक्टरी डिज़ाइन पैटर्न को कार्यान्वित करते समय 'इंस्टॉलेशनफ' से कैसे बचें? खोज बार पृष्ठभूमि रंग बदल नहीं सकते आईओसी / डीआई – मुझे प्रविष्टि आवेदन में सभी परतों / विधानसभाओं का संदर्भ क्यों मिला है? मैं ServletFilter में ServletResponse से HTTP स्थिति कोड कैसे प्राप्त करूं? जावास्क्रिप्ट / jQuery पर क्लिक करें काम नहीं कर रहा है डेटाटामप्लेट से अभिमुख डेटाकॉन्टेक्ट एक्सेस करें जब मैं edittextview पर एंड्रॉइड पर क्लिक करता हूं तो कीबोर्ड दिखाई नहीं देता है? दो टुकड़ों के बीच बुनियादी संचार जावा प्रदर्शन परीक्षण जावा में सिंगलटन के रूप में एन्यूम का उपयोग करने के लिए सबसे अच्छा तरीका क्या है?

कैसे यूटीएफ -8 तार की एक सरणी को सॉर्ट करने के लिए?

मैं वर्तमान में PHP पर PHP में UTF-8 एन्कोडेड स्ट्रिंग वाले सरणी को सॉर्ट करने का कोई संकेत नहीं देता है। सरणी एक एलडीएपी सर्वर से आता है ताकि डेटाबेस के माध्यम से वर्गीकृत किया जा सके (कोई समस्या नहीं होगी) कोई समाधान नहीं है निम्नलिखित मेरी खिड़कियां विकास मशीन पर काम नहीं करता है (हालांकि मुझे लगता था कि यह कम से कम संभव समाधान होना चाहिए):

$array=array('Birnen', 'Äpfel', 'Ungetüme', 'Apfel', 'Ungetiere', 'Österreich'); $oldLocal=setlocale(LC_COLLATE, "0"); var_dump(setlocale(LC_COLLATE, 'German_Germany.65001')); usort($array, 'strcoll'); var_dump(setlocale(LC_COLLATE, $oldLocal)); var_dump($array); 

आउटपुट है:

 string(20) "German_Germany.65001" string(1) "C" array(6) { [0]=> string(6) "Birnen" [1]=> string(9) "Ungetiere" [2]=> string(6) "Äpfel" [3]=> string(5) "Apfel" [4]=> string(9) "Ungetüme" [5]=> string(11) "Österreich" } 

यह पूरी बकवास है setlocale() लिए कोडपेज के रूप में 1252 का उपयोग करना एक और आउटपुट देता है लेकिन फिर भी एक स्पष्ट रूप से गलत है:

 string(19) "German_Germany.1252" string(1) "C" array(6) { [0]=> string(11) "Österreich" [1]=> string(6) "Äpfel" [2]=> string(5) "Apfel" [3]=> string(6) "Birnen" [4]=> string(9) "Ungetüme" [5]=> string(9) "Ungetiere" } 

क्या यूटीएफ -8 स्ट्रिंग लोकेल को जागरूक करने के लिए एक सरणी सॉर्ट करने का एक तरीका है?

बस नोट किया गया है कि यह विंडोज़ की समस्या पर PHP हो रहा है, जैसा कि डी- de_DE.utf8 साथ एक ही स्निपेट लिनक्स मशीन पर लोकेल काम करता है। फिर भी इस Windows- विशिष्ट समस्या का समाधान अच्छा होगा …

Solutions Collecting From Web of "कैसे यूटीएफ -8 तार की एक सरणी को सॉर्ट करने के लिए?"

 $a = array( 'Кръстев', 'Делян1', 'делян1', 'Делян2', 'делян3', 'кръстев' ); $col = new \Collator('bg_BG'); $col->asort( $a ); var_dump( $a ); 

प्रिंटों:

 array 2 => string 'делян1' (length=11) 1 => string 'Делян1' (length=11) 3 => string 'Делян2' (length=11) 4 => string 'делян3' (length=11) 5 => string 'кръстев' (length=14) 0 => string 'Кръстев' (length=14) 

Collator क्लास को पीईसीएल एक्सल एक्सटेंशन में परिभाषित किया गया है। यह PHP 5.3 स्रोतों के साथ वितरित किया जाता है लेकिन कुछ बिल्ड के लिए अक्षम हो सकता है उदाहरण के डेबियन में यह पैकेज php5-intl में है।

usort Collator::compare usort लिए उपयोगी है

इस मुद्दे पर अपडेट करें:

हालांकि इस समस्या के आस-पास की चर्चा से पता चला कि हमें strcoll() और / या strcoll() साथ एक PHP बग की खोज हो सकती थी, यह स्पष्ट रूप से मामला नहीं है। समस्या बल्कि setlocale() (PHPs setlocale() के विंडोज सीआरटी कार्यान्वयन की एक सीमा सीआरटी कॉल के चारों ओर एक पतली आवरण है निम्न MSDN पृष्ठ "सेटलोकैले, _wsetlocale" का उद्धरण है :

उपलब्ध भाषाओं, देश / क्षेत्र कोडों और कोड पेजों के सेट में उन कोड पृष्ठों को छोड़कर Win32 NLS एपीआई द्वारा समर्थित सभी शामिल हैं , जिनमें यूटीएफ -7 और यूटीएफ -8 जैसी दो बाइट्स प्रति चरित्र की आवश्यकता होती है अगर आप यूटीएफ -7 या यूटीएफ -8 जैसे कोड पेज प्रदान करते हैं, तो सेटलोकेल असफल हो जायेगा, नल लौटाएगा। सेटलोकेल द्वारा समर्थित भाषा और देश / क्षेत्र कोड का सेट भाषा और देश / क्षेत्र स्ट्रिंग्स में सूचीबद्ध है।

इसलिए स्ट्रिंग्स बहु-बाइट एन्कोडेड हैं जब Windows पर PHP पर लोकेल-जागृत स्ट्रिंग ऑपरेशन का उपयोग करना असंभव है।

आखिरकार, इस समस्या का एक सरल तरीके से रिकोडेड स्ट्रिंग (यूटीएफ -8 → विंडोज -1252 या आईएसओ -885 9 -1) का उपयोग किए बिना हल किया जा सकता है, जैसा कि सुझाव दिया गया है क्योंकि एचपीपी द्वारा की गई एक स्पष्ट PHP बग के कारण। समस्या को संक्षेप करने के लिए, मैंने निम्न कोड स्निपेट बनाया जो स्पष्ट रूप से दर्शाता है कि समस्या 6551 विंडोज-यूटीएफ-8-कोडपेज का उपयोग करते समय स्ट्रक्ल () फ़ंक्शन है।

 function traceStrColl($a, $b) { $outValue=strcoll($a, $b); echo "$a $b $outValue\r\n"; return $outValue; } $locale=(defined('PHP_OS') && stristr(PHP_OS, 'win')) ? 'German_Germany.65001' : 'de_DE.utf8'; $string="ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜabcdefghijklmnopqrstuvwxyzäöüß"; $array=array(); for ($i=0; $i<mb_strlen($string, 'UTF-8'); $i++) { $array[]=mb_substr($string, $i, 1, 'UTF-8'); } $oldLocale=setlocale(LC_COLLATE, "0"); var_dump(setlocale(LC_COLLATE, $locale)); usort($array, 'traceStrColl'); setlocale(LC_COLLATE, $oldLocale); var_dump($array); 

परिणाम है:

 string(20) "German_Germany.65001" a B 2147483647 [...] array(59) { [0]=> string(1) "c" [1]=> string(1) "B" [2]=> string(1) "s" [3]=> string(1) "C" [4]=> string(1) "k" [5]=> string(1) "D" [6]=> string(2) "ä" [7]=> string(1) "E" [8]=> string(1) "g" [...] 

एक ही स्निपेट एक लिनक्स मशीन पर काम करता है, बिना किसी आउटपुट के उत्पादन की समस्या:

 string(10) "de_DE.utf8" a B -1 [...] array(59) { [0]=> string(1) "a" [1]=> string(1) "A" [2]=> string(2) "ä" [3]=> string(2) "Ä" [4]=> string(1) "b" [5]=> string(1) "B" [6]=> string(1) "c" [7]=> string(1) "C" [...] 

स्निपेट विंडोज -1252 (आईएसओ -885 9 -1) एन्कोडेड स्ट्रिंग्स का उपयोग करते समय काम करता है (बेशक एमबी_ एन्कोडिंग्स और फिर लोकेल बदलना होगा)।

मैंने bugs.php.net पर एक बग रिपोर्ट दायर की है: बग # 46165 strcoll () विंडोज पर यूटीएफ -8 स्ट्रिंग के साथ काम नहीं करता है यदि आप एक ही समस्या का अनुभव करते हैं, तो आप बग-रिपोर्ट पेज पर PHP टीम को अपनी प्रतिक्रिया दे सकते हैं (दो अन्य, शायद संबंधित, बग को फर्जी के रूप में वर्गीकृत किया गया है – मुझे नहीं लगता कि यह बग फर्जी है 😉

आप सभी को धन्यवाद।

यह एक बहुत ही जटिल मुद्दा है , क्योंकि यूटीएफ -8 एन्कोडेड डेटा में कोई यूनिकोड वर्ण हो सकता है (यानी कई 8-बिट एनकोडिंग से अक्षर जो अलग-अलग स्थानों में अलग-अलग तरह से अलग होते हैं)।

शायद अगर आपने यूटीएफ -8 डेटा को यूनिकोड में परिवर्तित किया है (PHP यूनिकोड फ़ंक्शंस से परिचित नहीं है, तो खेद है) और फिर उन्हें एनएफडी या एनएफकेडी में सामान्यीकृत किया जाता है और फिर कोड पॉइंट पर सॉर्टिंग से कुछ कोलेशन हो सकता है जो आपके लिए अर्थ होगा (यानी "ए" इसके पहले")।

मैं प्रदान की गई लिंकों की जांच करें

संपादित करें: चूंकि आप यह कहते हैं कि आपका इनपुट डेटा स्पष्ट है (मुझे लगता है कि वे सभी "विंडो -1252" कोडपेप में गिरते हैं), तो आपको निम्न रूपांतरण करना चाहिए: UTF-8 → यूनिकोड → Windows-1252, जिस पर Windows-1252 एन्कोडेड डेटा "CP1252" लोकेल का चयन करने का एक प्रकार है

कोडपेप 1252 के साथ अपने उदाहरण का उपयोग करके मेरी खिड़कियां विकास मशीन पर बिल्कुल ठीक काम किया।

 $array=array('Birnen', 'Äpfel', 'Ungetüme', 'Apfel', 'Ungetiere', 'Österreich'); $oldLocal=setlocale(LC_COLLATE, "0"); var_dump(setlocale(LC_COLLATE, 'German_Germany.1252')); usort($array, 'strcoll'); var_dump(setlocale(LC_COLLATE, $oldLocal)); var_dump($array); 

… कटाव …

यह PHP 5.2.6 के साथ था। btw।


उपरोक्त उदाहरण गलत है , यह यूटीएफ -8 की बजाय एएससीआईआई एन्कोडिंग का उपयोग करता है। मैंने strcoll () कॉल का पता लगाया और देखो मुझे क्या मिला:

 function traceStrColl($a, $b) { $outValue = strcoll($a, $b); echo "$a $b $outValue\r\n"; return $outValue; } $array=array('Birnen', 'Äpfel', 'Ungetüme', 'Apfel', 'Ungetiere', 'Österreich'); setlocale(LC_COLLATE, 'German_Germany.65001'); usort($array, 'traceStrColl'); print_r($array); 

देता है:

  Ungetüme Äpfel 2147483647
 Ungetüme बिरनेन 2147483647
 Ungetüme Apfel 2147483647
 Ungetüme Ungetiere 2147483647
 Österreich Ungetüme 2147483647
 एपफ़ेल अनगेटेयर 2147483647
 एपीफ़ेल बिरनेन 2147483647
 Apfel Äpfel 2147483647
 अनगिएयर बिरनेन 2147483647 

मुझे कुछ बग रिपोर्ट मिली जो कि फर्जी होने के झंडे हैं … आपके पास सबसे अच्छी शर्त है, बग-रिपोर्ट दाखिल कर रहा हूं, हालांकि मुझे लगता है …

मुझे ये निम्नलिखित सहायक फ़ंक्शन को स्ट्रिंग के सभी अक्षरों को एएससीआईआई अक्षरों में परिवर्तित करने के लिए बहुत उपयोगी मिला।

 function _all_letters_to_ASCII($string) { return strtr(utf8_decode($string), utf8_decode('ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ'), 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy'); } 

उसके बाद एक सरल array_multisort() आपको देता है जो आप चाहते हैं

 $array = array('Birnen', 'Äpfel', 'Ungetüme', 'Apfel', 'Ungetiere', 'Österreich'); $reference_array = $array; foreach ($reference_array as $key => &$value) { $value = _all_letters_to_ASCII($value); } var_dump($reference_array); array_multisort($reference_array, $array); var_dump($array); 

बेशक आप सहायक कार्य को और अधिक उन्नत आवश्यकताओं को फिट कर सकते हैं। लेकिन अभी के लिए, यह बहुत अच्छा लग रहा है।

 array(6) { [0]=> string(6) "Birnen" [1]=> string(5) "Apfel" [2]=> string(8) "Ungetume" [3]=> string(5) "Apfel" [4]=> string(9) "Ungetiere" [5]=> string(10) "Osterreich" } array(6) { [0]=> string(5) "Apfel" [1]=> string(6) "Äpfel" [2]=> string(6) "Birnen" [3]=> string(11) "Österreich" [4]=> string(9) "Ungetiere" [5]=> string(9) "Ungetüme" } 

मैं जर्मन "उमौते" के साथ एक ही समस्या के साथ सामना कर रहा हूँ कुछ शोध के बाद, यह मेरे लिए काम किया:

 $laender =array("Österreich", "Schweiz", "England", "France", "Ägypten"); $laender = array_map("utf8_decode", $laender); setlocale(LC_ALL,"de_DE@euro", "de_DE", "deu_deu"); sort($laender, SORT_LOCALE_STRING); $laender = array_map("utf8_encode", $laender); print_r($laender); 

परिणाम:

सरणी
(
[0] => ईजबेन
[1] => इंग्लैंड
[2] => फ्रांस
[3] => ओस्टररिच
[4] => श्वेविज़
)

आपके मिलान को वर्ण सेट से मिलान करने की आवश्यकता है। चूंकि आपका डेटा यूटीएफ -8 एन्कोडेड है, इसलिए आपको यूटीएफ -8 कोलेशन का उपयोग करना चाहिए। इसे अलग प्लेटफार्मों पर अलग तरह से नाम दिया जा सकता है, लेकिन एक अच्छा अनुमान de_DE.utf8 होगा।

यूनिक्स सिस्टम पर, आप कमांड के साथ वर्तमान में इंस्टॉल किए गए लोकेल की एक सूची प्राप्त कर सकते हैं

 locale -a