রুবি 2.4 এর সাথে পাঠানো নতুন বৈশিষ্ট্যগুলির মধ্যে উন্নত ইউনিকোড সমর্থন। বিশেষভাবে, upcase এর মত পদ্ধতি এবং downcase প্রত্যাশিতভাবে কাজ করুন, "ä" থেকে "Ä" এবং ফিরে যান। এটি আমাকে কৌতূহলী করে তুলেছে:2013 সাল থেকে অন্য কোন ইউনিকোড উন্নতি হয়েছে যখন আমি রুবিতে আন্দ্রে আরকোর ব্লগ পোস্ট পড়ি তখন স্ট্রিংস এখন UTF-8… তাই না?
আমি রুবির সমস্ত স্ট্রিং পদ্ধতি পরীক্ষা করেছি, প্রযুক্তিগত ত্রুটির জন্য নয় বরং "অন্যতম আশ্চর্যের নীতি" লঙ্ঘনের জন্য। বিশেষভাবে, আমার অনুমান ছিল যে:
- অনন্য অক্ষর অনন্য: "e" এবং "ë" আলাদা, ঠিক যেমন "e" এবং "E" হয়।
- একক অক্ষর একক অক্ষর হিসাবে গণনা করে, ইউনিকোডে তারা যেভাবে উপস্থাপন করা হোক না কেন। এর মানে হল যে "e" এবং "ë" প্রতিটি একটি একক অক্ষর, যদিও পরবর্তী দুটি কোড পয়েন্ট দ্বারা উপস্থাপিত হয়।
- অক্ষরগুলি অপরিবর্তনীয়৷৷ অক্ষরের একটি স্ট্রিং উল্টে দিলে স্বতন্ত্র অক্ষর পরিবর্তন করা উচিত নয়।
- হোয়াইটস্পেসকে হোয়াইটস্পেস হিসাবে বিবেচনা করা হয়। এমনকি সেই কৌশলী ইউনিকোড হোয়াইটস্পেস অক্ষর।
- অঙ্কগুলিকে অঙ্ক হিসাবে গণ্য করা হয়৷৷ সংখ্যা 2 সর্বদা 2 নম্বরই হয় তা যেভাবেই লেখা হোক না কেন।
দুর্ভাগ্যবশত, রুবির বেশিরভাগ স্ট্রিং ম্যানিপুলেশন পদ্ধতি এই পরীক্ষায় ব্যর্থ হয়। আপনি যদি ইউনিকোড স্ট্রিং নিয়ে কাজ করেন, তাহলে আপনি কোনটি ব্যবহার করবেন তা অত্যন্ত সতর্ক থাকতে হবে।
দ্রষ্টব্য:প্রকাশনার পরে, কিছু পাঠক উল্লেখ করেছেন যে আমি উল্লেখ করেছি যে অনেক ব্যর্থতা ঘটত না যদি আমি ইউনিকোড পরীক্ষার স্ট্রিংগুলিকে স্বাভাবিক করতাম। এটা সত্য. তবে স্ট্রিংগুলি স্বয়ংক্রিয়ভাবে রুবি বা রেল দ্বারা স্বাভাবিক করা হয় না (আমি পরীক্ষা করেছি যে কোনও অ্যাপে)। এই পরীক্ষাগুলি সর্বদা সবচেয়ে খারাপ-কেস চিত্রিত করার জন্য বোঝানো হয়েছিল এবং আমি মনে করি সেগুলি এখনও সেই ক্ষেত্রে কার্যকর।
রুবি 2.4.0 এর সাথে ইউনিকোড পরীক্ষা
| পদ্ধতি | পরীক্ষা | প্রত্যাশিত | ফলাফল | রায় |
|---|---|---|---|---|
| #% | "%s" % "noël" | "noël" | "noël" | ঠিক আছে |
| #* | "noël" * 2 | "noëlnoël" | "noëlnoël" | ঠিক আছে |
| #<< | "noël" << "ë" | "noëlë" | "noëlë" | ঠিক আছে |
| #<=> | "ä" <=> "z" | -1 | -1 | ঠিক আছে |
| #== | "ä" == "ä" | true | true | ঠিক আছে |
| #=~ | "ä" =~ /a./ | nil | 0 | সাবধান! |
| #[] | "ä"[0] | "ä" | "a" | সাবধান! |
| #[]= | "ä"[0] = "u" | "u" | "u" | ঠিক আছে |
| #b | "ä".b.encoding.to_s | "ASCII-8BIT" | "ASCII-8BIT" | ঠিক আছে |
| #বাইট | "ä".bytes | [97, 204, 136] | [97, 204, 136] | ঠিক আছে |
| #bytesize | "ä".bytesize | 3 | 3 | ঠিক আছে |
| #byteslice | "ä".byteslice(1) | "\xCC" | "\xCC" | ঠিক আছে |
| #ক্যাপিটালাইজ | "ä".capitalize | "Ä" | "Ä" | ঠিক আছে |
| #casecmp | "äa".casecmp("äz") | -1 | -1 | ঠিক আছে |
| #কেন্দ্র | "ä".center(3) | " ä " | "ä " | সাবধান! |
| # অক্ষর | "ä".chars | ["ä"] | ["a", "̈"] | সাবধান! |
| #chomp | "ä
".chomp | "ä" | "ä" | ঠিক আছে |
| #চপ | "ä".chop | "" | "a" | সাবধান! |
| #chr | "ä".chr | "ä" | "a" | সাবধান! |
| #ক্লিয়ার | "ä".clear | "" | "" | ঠিক আছে |
| #codepoints | "ä".codepoints | [97, 776] | [97, 776] | ঠিক আছে |
| #concat | "ä".concat("x") | "äx" | "äx" | ঠিক আছে |
| #count | "ä".count("a") | 0 | 1 | সাবধান! |
| #crypt | "123".crypt("ää") == "123".crypt("aa") | false | false | ঠিক আছে |
| #মুছুন | "ä".delete("a") | "ä" | "̈" | সাবধান! |
| #downcase | "Ä".downcase | "ä" | "ä" | ঠিক আছে |
| #ডাম্প | "ä".dump | "\"a\\u0308\"" | "\"a\\u0308\"" | ঠিক আছে |
| #each_byte | "ä".each_byte.to_a | [97, 204, 136] | [97, 204, 136] | ঠিক আছে |
| #each_char | "ä".each_char.to_a | ["ä"] | ["a", "̈"] | সাবধান! |
| #each_codepoint | "ä".each_codepoint.to_a | [97, 776] | [97, 776] | ঠিক আছে |
| #each_line | "ä".each_line.to_a | ["ä"] | ["ä"] | ঠিক আছে |
| #খালি? | "ä".empty? | false | false | ঠিক আছে |
| #encode | "ä".encode("ASCII", undef: :replace) | "a?" | "a?" | ঠিক আছে |
| #এনকোডিং | "ä".encoding.to_s | "UTF-8" | "UTF-8" | ঠিক আছে |
| #end_with? | "ä".end_with?("ä") | true | true | ঠিক আছে |
| #eql? | "ä".eql?("a") | false | false | ঠিক আছে |
| #force_encoding | "ä".force_encoding("ASCII") | "a\xCC\x88" | "a\xCC\x88" | ঠিক আছে |
| #getbyte | "ä".getbyte(2) | 136 | 136 | ঠিক আছে |
| #gsub | "ä".gsub("a", "x") | "ä" | "ẍ" | সাবধান! |
| #হ্যাশ | "ä".hash == "a".hash | false | false | ঠিক আছে |
| #অন্তর্ভুক্ত? | "ä".include?("a") | false | true | সাবধান! |
| #index | "ä".index("a") | nil | 0 | সাবধান! |
| #প্রতিস্থাপন | "ä".replace("u") | "u" | "u" | ঠিক আছে |
| # insert | "ä".insert(1, "u") | "äu" | "aü" | সাবধান! |
| #পরিদর্শন | "ä".inspect | "\"ä\"" | "\"ä\"" | ঠিক আছে |
| #ইন্টার্ন | "ä".intern | :ä | :ä | ঠিক আছে |
| #দৈর্ঘ্য | "ä".length | 1 | 2 | সাবধান! |
| #ljust | "ä".ljust(3, "_") | "ä__" | "ä_" | সাবধান! |
| #lstrip | " ä".lstrip | "ä" | "ä" | ঠিক আছে |
| # ম্যাচ | "ä".match("a") | nil | # | সাবধান! |
| #পরবর্তী | "ä".next | "ä" | "b̈" | সাবধান! |
| #ord | "ä".ord | 97 | 97 | ঠিক আছে |
| #পার্টিশন | "händ".partition("a") | ["händ"] | ["h", "a", "̈nd"] | সাবধান! |
| #prepend | "ä".prepend("ä") | "ää" | "ää" | ঠিক আছে |
| #প্রতিস্থাপন | "ä".replace("ẍ") | "ẍ" | "ẍ" | ঠিক আছে |
| # বিপরীত | "händ".reverse | "dnäh" | "dn̈ah" | সাবধান! |
| #rpartition | "händ".rpartition("a") | ["händ"] | ["h", "a", "̈nd"] | সাবধান! |
| #rstrip | "line ".rstrip | "line" | "line " | সাবধান! |
| #স্ক্রাব | "ä".scrub | "ä" | "ä" | ঠিক আছে |
| #setbyte | s = "ä"; s.setbyte(0, "x".ord); s | "ẍ" | "ẍ" | ঠিক আছে |
| #size | "ä".size | 1 | 2 | সাবধান! |
| # স্লাইস | "ä".slice(0) | "ä" | "a" | সাবধান! |
| # স্প্লিট | "ä".split("a") | ["ä"] | ["", "̈"] | সাবধান! |
| # চেপে | "ää".squeeze("ä") | "ä" | "ää" | সাবধান! |
| #start_with? | "ä".start_with?("a") | false | true | সাবধান! |
| # স্ট্রিপ | " line ".strip | "line" | " line " | সাবধান! |
| #sub | "ä".sub("a", "x") | "ä" | "ẍ" | সাবধান! |
| #succ | "ä".succ | "b̈" | "b̈" | ঠিক আছে |
| #swapcase | "ä".swapcase | "Ä" | "Ä" | ঠিক আছে |
| #to_c | "١".to_c | (1+0i) | (0+0i) | সাবধান! |
| #to_f | "١".to_f | 1.0 | 0.0 | সাবধান! |
| #to_i | "١".to_i | 1 | 0 | সাবধান! |
| #to_r | "١".to_r | (1/1) | (0/1) | সাবধান! |
| #to_sym | "ä".to_sym | :ä | :ä | ঠিক আছে |
| #tr | "ä".tr("a", "b") | "ä" | "b̈" | সাবধান! |
| #আনপ্যাক | "ä".unpack("CCC") | [97, 204, 136] | [97, 204, 136] | ঠিক আছে |
| # পর্যন্ত | "ä".upto("c̈").to_a | ["ä", "b̈", "c̈"] | ["ä", "b̈", "c̈"] | ঠিক আছে |
| #valid_encoding? | "ä".valid_encoding? | true | true | ঠিক আছে |