Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Ruby

Ruby 2.4 के उन्नत यूनिकोड सपोर्ट की खोज

Ruby 2.4 के साथ शिप की गई नई विशेषताओं में बेहतर यूनिकोड सपोर्ट है। विशेष रूप से, upcase और downcase जैसे मेथड्स अपेक्षा के अनुरूप काम करते हैं, "ä" को "Ä" और वापस में बदलते हैं। इसने मुझे उत्सुक बना दिया: 2013 के बाद से क्या अन्य यूनिकोड सुधार किए गए हैं जब मैंने André Arko का ब्लॉग पोस्ट "Strings in Ruby are UTF-8 now… right??" पढ़ा था?

मैंने Ruby के सभी स्ट्रिंग मेथड्स को टेस्ट किया, तकनीकी त्रुटियों की तलाश नहीं, बल्कि "लीस्ट सरप्राइज के सिद्धांत" के उल्लंघन की। विशेष रूप से, मेरी धारणाएं थीं कि:

  1. अद्वितीय वर्ण अद्वितीय हैं: "e" और "ë" अलग हैं, जैसे "e" और "E" हैं।
  2. सिंगल वर्ण सिंगल वर्ण के रूप में गिने जाते हैं, चाहे वे यूनिकोड में कैसे भी दर्शाए गए हों। इसका मतलब है कि "e" और "ë" प्रत्येक एक सिंगल वर्ण हैं, भले ही बाद वाले को दो कोड पॉइंट्स द्वारा दर्शाया गया हो।
  3. वर्ण अपरिवर्तनीय हैं। वर्णों की एक स्ट्रिंग को उलटने से व्यक्तिगत वर्णों को नहीं बदलना चाहिए।
  4. व्हाइटस्पेस को व्हाइटस्पेस के रूप में माना जाता है। यहां तक कि वे ट्रिकी यूनिकोड व्हाइटस्पेस वर्ण भी।
  5. अंकों को अंकों के रूप में माना जाता है। संख्या 2 हमेशा संख्या 2 है चाहे इसे कैसे भी लिखा जाए।

दुर्भाग्य से, Ruby के अधिकांश स्ट्रिंग मैनिपुलेशन मेथड्स इन टेस्ट्स में विफल होते हैं। यदि आप यूनिकोड स्ट्रिंग्स के साथ काम कर रहे हैं, तो आपको बहुत सावधान रहना होगा कि आप किनका उपयोग करते हैं।

नोट: प्रकाशन के बाद, कुछ पाठकों ने बताया कि मैंने जिन विफलताओं का उल्लेख किया है, वे नहीं हुई होतीं यदि मैंने यूनिकोड टेस्ट स्ट्रिंग्स को नॉर्मलाइज़ किया होता। यह सच है। हालांकि, Ruby या Rails द्वारा किसी भी ऐप में स्ट्रिंग्स स्वचालित रूप से नॉर्मलाइज़ नहीं होतीं (जिन्हें मैंने टेस्ट किया)। ये टेस्ट हमेशा सबसे खराब स्थिति को स्पष्ट करने के लिए थे और मुझे लगता है कि वे उस संबंध में अभी भी उपयोगी हैं।

Ruby 2.4.0 के साथ यूनिकोड टेस्ट्स

मेथड टेस्ट अपेक्षित परिणाम निर्णय
#%"%s" % "noël""noël""noël" OK
#*"noël" * 2"noëlnoël""noëlnoël" OK
#<<"noël" << "ë""noëlë""noëlë" OK
#<=>"ä" <=> "z"-1-1 OK
#=="ä" == "ä"truetrue OK
#=~"ä" =~ /a./nil0 सावधान!
#[]"ä"[0]"ä""a" सावधान!
#[]="ä"[0] = "u""u""u" OK
#b"ä".b.encoding.to_s"ASCII-8BIT""ASCII-8BIT" OK
#bytes"ä".bytes[97, 204, 136][97, 204, 136] OK
#bytesize"ä".bytesize33 OK
#byteslice"ä".byteslice(1)"\xCC""\xCC" OK
#capitalize"ä".capitalize"Ä""Ä" OK
#casecmp"äa".casecmp("äz")-1-1 OK
#center"ä".center(3)" ä ""ä " सावधान!
#chars"ä".chars["ä"]["a", "̈"] सावधान!
#chomp"ä ".chomp"ä""ä" OK
#chop"ä".chop"""a" सावधान!
#chr"ä".chr"ä""a" सावधान!
#clear"ä".clear"""" OK
#codepoints"ä".codepoints[97, 776][97, 776] OK
#concat"ä".concat("x")"äx""äx" OK
#count"ä".count("a")01 सावधान!
#crypt"123".crypt("ää") == "123".crypt("aa")falsefalse OK
#delete"ä".delete("a")"ä""̈" सावधान!
#downcase"Ä".downcase"ä""ä" OK
#dump"ä".dump"\"a\\u0308\"""\"a\\u0308\"" OK
#each_byte"ä".each_byte.to_a[97, 204, 136][97, 204, 136] OK
#each_char"ä".each_char.to_a["ä"]["a", "̈"] सावधान!
#each_codepoint"ä".each_codepoint.to_a[97, 776][97, 776] OK
#each_line"ä".each_line.to_a["ä"]["ä"] OK
#empty?"ä".empty?falsefalse OK
#encode"ä".encode("ASCII", undef: :replace)"a?""a?" OK
#encoding"ä".encoding.to_s"UTF-8""UTF-8" OK
#end_with?"ä".end_with?("ä")truetrue OK
#eql?"ä".eql?("a")falsefalse OK
#force_encoding"ä".force_encoding("ASCII")"a\xCC\x88""a\xCC\x88" OK
#getbyte"ä".getbyte(2)136136 OK
#gsub"ä".gsub("a", "x")"ä""ẍ" सावधान!
#hash"ä".hash == "a".hashfalsefalse OK
#include?"ä".include?("a")falsetrue सावधान!
#index"ä".index("a")nil0 सावधान!
#replace"ä".replace("u")"u""u" OK
#insert"ä".insert(1, "u")"äu""aü" सावधान!
#inspect"ä".inspect"\"ä\"""\"ä\"" OK
#intern"ä".intern:ä:ä OK
#length"ä".length12 सावधान!
#ljust"ä".ljust(3, "_")"ä__""ä_" सावधान!
#lstrip" ä".lstrip"ä""ä" OK
#match"ä".match("a")nil#<MatchData "a"> सावधान!
#next"ä".next"ä""b̈" सावधान!
#ord"ä".ord9797 OK
#partition"händ".partition("a")["händ"]["h", "a", "̈nd"] सावधान!
#prepend"ä".prepend("ä")"ää""ää" OK
#replace"ä".replace("ẍ")"ẍ""ẍ" OK
#reverse"händ".reverse"dnäh""dn̈ah" सावधान!
#rpartition"händ".rpartition("a")["händ"]["h", "a", "̈nd"] सावधान!
#rstrip"line ".rstrip"line""line " सावधान!
#scrub"ä".scrub"ä""ä" OK
#setbytes = "ä"; s.setbyte(0, "x".ord); s"ẍ""ẍ" OK
#size"ä".size12 सावधान!
#slice"ä".slice(0)"ä""a" सावधान!
#split"ä".split("a")["ä"]["", "̈"] सावधान!
#squeeze"ää".squeeze("ä")"ä""ää" सावधान!
#start_with?"ä".start_with?("a")falsetrue सावधान!
#strip" line ".strip"line"" line " सावधान!
#sub"ä".sub("a", "x")"ä""ẍ" सावधान!
#succ"ä".succ"b̈""b̈" OK
#swapcase"ä".swapcase"Ä""Ä" OK
#to_c"१".to_c(1+0i)(0+0i) सावधान!
#to_f"१".to_f1.00.0 सावधान!
#to_i"१".to_i10 सावधान!
#to_r"१".to_r(1/1)(0/1) सावधान!
#to_sym"ä".to_sym:ä:ä OK
#tr"ä".tr("a", "b")"ä""b̈" सावधान!
#unpack"ä".unpack("CCC")[97, 204, 136][97, 204, 136] OK
#upto"ä".upto("c̈").to_a["ä", "b̈", "c̈"]["ä", "b̈", "c̈"] OK
#valid_encoding?"ä".valid_encoding?truetrue OK
  1. विंडोज़ 8 ज़ून सपोर्ट हटाएगा विंडोज़ 8 ज़ून सपोर्ट हटाएगा

    माइक्रोसॉफ्ट के विंडोज़ 8 में नए मेट्रो इंटरफेस को लेकर बहुत प्रचार रहा है, लेकिन कई लोग निराश हो सकते हैं क्योंकि विंडोज़ के पिछले संस्करणों में वे जिन एप्लिकेशन को जानते और प्यार करते हैं, वे विंडोज़ 8 में बस *गायब* हो सकते हैं। जबकि पिछले संस्करणों में काम करने वाला अधिकांश विंडोज़ सॉफ्टवेयर विंड

  1. विश्वसनीय क्लाउड ऐप विकास के लिए शीर्ष 25 API टेस्टिंग टूल्स विश्वसनीय क्लाउड ऐप विकास के लिए शीर्ष 25 API टेस्टिंग टूल्स

    जैसे-जैसे क्लाउड ऐप्स और संबंधित प्लेटफॉर्म की संख्या बढ़ी है, API टेस्टिंग तेजी से महत्वपूर्ण हो गई है। सरल शब्दों में, एक API (एप्लिकेशन प्रोग्रामिंग इंटरफेस) वह मैसेंजर है जो दो सॉफ़्टवेयर प्रोग्राम को आपस में इंटरैक्ट करने और डेटा साझा करने की अनुमति देता है। चूंकि यह फ्रंट एंड पर नहीं किया जा स

  1. एंड्रॉइड और iOS ऐप्स के लिए टॉप 17 मोबाइल टेस्टिंग टूल्स एंड्रॉइड और iOS ऐप्स के लिए टॉप 17 मोबाइल टेस्टिंग टूल्स

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