Ift‍👩‍👧‍👦 এর মতো ইমোজি চরিত্রগুলিকে সুইফ্ট স্ট্রিংগুলিতে এত অদ্ভুত আচরণ করা হয় কেন?


538

চরিত্রটি 👩‍👩‍👧‍ (দুই মহিলা, একটি মেয়ে এবং একটি ছেলে সহ পরিবার) এরকম এনকোড করা আছে:

U+1F469 WOMAN,
‍U+200D ZWJ,
U+1F469 WOMAN,
U+200D ZWJ,
U+1F467 GIRL,
U+200D ZWJ,
U+1F466 BOY

সুতরাং এটি খুব আকর্ষণীয়-এনকোডযুক্ত; ইউনিট পরীক্ষার জন্য নিখুঁত লক্ষ্য। তবে, কীভাবে এটি ব্যবহার করা যায় তা সুইফ্ট জানে বলে মনে হয় না। আমি যা বলতে চাইছি তা এখানে:

"👩‍👩‍👧‍👦".contains("👩‍👩‍👧‍👦") // true
"👩‍👩‍👧‍👦".contains("👩") // false
"👩‍👩‍👧‍👦".contains("\u{200D}") // false
"👩‍👩‍👧‍👦".contains("👧") // false
"👩‍👩‍👧‍👦".contains("👦") // true

সুতরাং, সুইফট বলছে এটিতে নিজের (ভাল) এবং একটি ছেলে রয়েছে (ভাল!)। তবে এটি তখন বলে যে এটিতে কোনও মহিলা, মেয়ে বা শূন্য প্রস্থের সংযোজক নেই। এখানে কি হচ্ছে? সুইফট কেন জানে যে এতে একটি ছেলে আছে তবে মহিলা বা মেয়ে নেই? আমি এটি বুঝতে পারি যদি এটি এটিকে একটি একক চরিত্র হিসাবে বিবেচনা করে এবং কেবল এটি নিজের ধারণ করে তা স্বীকৃতি দেয় তবে এটি যে একটি উপ-উপাদান পেয়েছে এবং অন্য কেউ আমাকে অবাক করে না।

আমি যদি এমন কিছু ব্যবহার করি তবে এটি পরিবর্তন হয় না "👩".characters.first!


আরও বিভ্রান্তিকর এটি:

let manual = "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}"
Array(manual.characters) // ["👩‍", "👩‍", "👧‍", "👦"]

যদিও আমি সেখানে জেডডাব্লুজেজে রেখেছি, তারা চরিত্রের অ্যারেতে প্রতিফলিত হয় না। এরপরে যা কিছু বলা হয়েছিল তা হল:

manual.contains("👩") // false
manual.contains("👧") // false
manual.contains("👦") // true

তাই আমি চরিত্রের অ্যারের সাথে একই আচরণ পাই ... যা চূড়ান্তভাবে বিরক্তিকর, যেহেতু আমি জানি অ্যারে কেমন দেখাচ্ছে।

আমি যদি এমন কিছু ব্যবহার করি তবে এটিও পরিবর্তন হয় না "👩".characters.first!



1
মন্তব্যগুলি বর্ধিত আলোচনার জন্য নয়; এই কথোপকথন চ্যাটে সরানো হয়েছে ।
মার্টিজন পিটারস

1
সুইফট ৪ এ স্থির করা হয়েছে "👩‍👩‍👧‍👦".contains("\u{200D}")তবুও মিথ্যা ফিরিয়ে দেয়, এটি কোনও বাগ বা বৈশিষ্ট্য কিনা তা নিশ্চিত নয়।
কেভিন 21

3
বাবা। ইউনিকোড পাঠ্য নষ্ট করেছে। এটি সরল পাঠ্যটিকে একটি মার্কআপ ভাষায় রূপান্তরিত করেছে।
বোয়ান

5
@ বনান হ্যাঁ এবং না ... হ্যাঙ্গুল জামো (২৫৫ কোডপয়েন্ট) এর মতো এন / ডিকোডিংয়ের জিনিসগুলি তৈরি করার জন্য এই সমস্ত পরিবর্তন আনা হয়েছিল যা কান্জি (১৩,১০৮ কোডপয়েন্টস) এবং চাইনিজ আইডিয়াগ্রাফের (১৯৯,৫২৮ কোডপয়েন্টস) মতো ছিল না। অবশ্যই, এটি কোনও এসও কমেন্টের দৈর্ঘ্যের তুলনায় আরও জটিল এবং আকর্ষণীয়, তাই আমি আপনাকে এটি নিজেই যাচাই করতে উত্সাহিত করি: ডি
বেন লেগজিও

উত্তর:


401

এটি কীভাবে Stringসুইফটে টাইপটি কাজ করে এবং কীভাবে contains(_:)পদ্ধতিটি কাজ করে তার সাথে এটি করতে হবে ।

'👩‍👩‍👧‍👦' যা ইমোজি সিকোয়েন্স হিসাবে পরিচিত, যা স্ট্রিংয়ের মধ্যে একটি দৃশ্যমান চরিত্র হিসাবে রেন্ডার করা হয়। ক্রমটি Characterবস্তুগুলি নিয়ে গঠিত এবং একই সাথে এটি UnicodeScalarবস্তুগুলি নিয়ে গঠিত ।

আপনি যদি স্ট্রিংয়ের চরিত্রের গণনাটি পরীক্ষা করেন, আপনি দেখতে পাবেন এটি চারটি অক্ষর দ্বারা গঠিত, আপনি যদি ইউনিকোড স্কেলারের গণনা পরীক্ষা করেন, এটি আপনাকে আলাদা ফলাফল দেখাবে:

print("👩‍👩‍👧‍👦".characters.count)     // 4
print("👩‍👩‍👧‍👦".unicodeScalars.count) // 7

এখন, আপনি যদি অক্ষরগুলি বিশ্লেষণ করে মুদ্রণ করেন তবে দেখতে পাবেন যে সাধারণ অক্ষরগুলির মতো লাগে তবে তিনটি প্রথম অক্ষরে ইমোজি পাশাপাশি একটি শূন্য প্রস্থের জোয়ার উভয়ই থাকে UnicodeScalarView :

for char in "👩‍👩‍👧‍👦".characters {
    print(char)

    let scalars = String(char).unicodeScalars.map({ String($0.value, radix: 16) })
    print(scalars)
}

// 👩‍
// ["1f469", "200d"]
// 👩‍
// ["1f469", "200d"]
// 👧‍
// ["1f467", "200d"]
// 👦
// ["1f466"]

যেমন আপনি দেখতে পাচ্ছেন, কেবলমাত্র শেষ চরিত্রটিতে শূন্য প্রস্থের সংযুক্তকারী নেই, সুতরাং contains(_:)পদ্ধতিটি ব্যবহার করার সময় এটি আপনি যেমন প্রত্যাশা করতেন তেমন কাজ করে। যেহেতু আপনি শূন্য-প্রস্থের সংযোগকারী ইমোজিগুলির সাথে তুলনা করছেন না, পদ্ধতিটি শেষ চরিত্রটি ছাড়া আর কোনওটির জন্য কোনও মিল খুঁজে পাবে না।

এটি প্রসারিত করার জন্য, আপনি যদি Stringকোনও ইমোজি চরিত্রের সমন্বয়ে একটি শূন্য প্রস্থের সংযুক্তকারী দ্বারা তৈরি হয়ে থাকে এবং এটি contains(_:)পদ্ধতিতে পাস করেন তবে এটির মূল্যায়নও হবে false। এই কি আছে contains(_:)যেমন সঠিক একই হচ্ছে range(of:) != nil, যা প্রদত্ত যুক্তি একটি সঠিক মিল খোঁজ করে। যেহেতু শূন্য-প্রস্থের সংযুক্তকারীর সাথে শেষ হওয়া অক্ষরগুলি একটি অসম্পূর্ণ অনুক্রম তৈরি করে, শূন্য-প্রস্থের সংযুক্তকারীগুলির সাথে সমাপ্ত অক্ষরগুলিকে সম্পূর্ণ অনুক্রমের সাথে সংমিশ্রিত করার সময় পদ্ধতিটি আর্গুমেন্টের জন্য একটি মিল খুঁজে পাওয়ার চেষ্টা করে। এর অর্থ হল যে পদ্ধতিটি কোনও মিল খুঁজে পাবে না যদি:

  1. যুক্তিটি একটি শূন্য প্রস্থের সংযুক্তকারীর সাথে শেষ হয় এবং
  2. পার্স করার স্ট্রিংটিতে একটি অসম্পূর্ণ অনুক্রম নেই (অর্থাত্ শূন্য প্রস্থের সংযুক্তকারীর সাথে শেষ হওয়া এবং কোনও সামঞ্জস্যপূর্ণ অক্ষর অনুসরণ করা হবে না)।

প্রদর্শন করার জন্যে:

let s = "\u{1f469}\u{200d}\u{1f469}\u{200d}\u{1f467}\u{200d}\u{1f466}" // 👩‍👩‍👧‍👦

s.range(of: "\u{1f469}\u{200d}") != nil                            // false
s.range(of: "\u{1f469}\u{200d}\u{1f469}") != nil                   // false

তবে তুলনাটি কেবলমাত্র সামনে দেখায়, আপনি পেছনের দিকে কাজ করে স্ট্রিংয়ের মধ্যে আরও কয়েকটি সম্পূর্ণ ক্রম সন্ধান করতে পারেন:

s.range(of: "\u{1f466}") != nil                                    // true
s.range(of: "\u{1f467}\u{200d}\u{1f466}") != nil                   // true
s.range(of: "\u{1f469}\u{200d}\u{1f467}\u{200d}\u{1f466}") != nil  // true

// Same as the above:
s.contains("\u{1f469}\u{200d}\u{1f467}\u{200d}\u{1f466}")          // true

সবচেয়ে সহজ সমাধান range(of:options:range:locale:)পদ্ধতিটিতে একটি নির্দিষ্ট তুলনা বিকল্প সরবরাহ করা হবে । বিকল্পটি হুবহু অক্ষর দ্বারা বর্ণের সমতুল্যেরString.CompareOptions.literal তুলনা সম্পাদন করে । পার্শ্ব নোট হিসাবে, এখানে অক্ষর বলতে যা বোঝায় তা সুইফট নয় , তবে ইউটিএফ -16 উভয়ই উদাহরণ এবং তুলনা স্ট্রিংয়ের উপস্থাপনা - তবে যেহেতু ত্রুটিযুক্ত ইউটিএফ -১ 16 অনুমতি দেয় না, এটি মূলত ইউনিকোড স্কেলারের সাথে তুলনা করার সমতুল্য উপস্থাপনা।CharacterString

এখানে আমি Foundationপদ্ধতিটি ওভারলোড করেছি , সুতরাং আপনার যদি আসলটির প্রয়োজন হয় তবে এই নাম বা কোনওটির নতুন নাম দিন:

extension String {
    func contains(_ string: String) -> Bool {
        return self.range(of: string, options: String.CompareOptions.literal) != nil
    }
}

এখন পদ্ধতিটি প্রতিটি চরিত্রের সাথে "অসম্পূর্ণ" হিসাবে কাজ করে এমনকি অসম্পূর্ণ অনুক্রম সহ:

s.contains("👩")          // true
s.contains("👩\u{200d}")  // true
s.contains("\u{200d}")    // true

47
@MartinR বর্তমান UTR29 (ইউনিকোড 9.0) অনুযায়ী, এটা হল একটি বর্ধিত গ্রাফিম ক্লাস্টার ( GB10 এবং GB11 নিয়ম ), কিন্তু সুইফট পরিষ্কারভাবে একটি পুরোনো সংস্করণ ব্যবহার করে। স্পষ্টতই এটি ঠিক করা ভাষাটির সংস্করণ 4 -এর লক্ষ্য , সুতরাং ভবিষ্যতে এই আচরণটি পরিবর্তিত হবে।
মাইকেল হোমার

9
@ মিশেলহোমর: দৃশ্যত এটি স্থির করা হয়েছে, বর্তমানের এক্সকোড 9 বিটা এবং সুইফট 4 নিয়ে "👩‍👩‍👧‍👦".countমূল্যায়ন করেছেন1
মার্টিন আর

5
কি দারুন. এটি দুর্দান্ত। তবে এখন আমি পুরানো দিনগুলিতে নস্টালজিক হয়েছি যখন আমার স্ট্রিংগুলির মধ্যে সবচেয়ে খারাপ সমস্যাটি হ'ল তারা সি বা পাস্কাল স্টাইলের এনকোডিংগুলি ব্যবহার করে।
ওডেন গডফ্রে

2
আমি বুঝতে পেরেছি কেন ইউনিকোড স্ট্যান্ডার্ডটিকে এটি সমর্থন করার প্রয়োজন হতে পারে তবে মানুষ, এটি একটি অতিমাত্রায় জগাখিচুড়ি, যদি কিছু থাকে: /
মনিকা

108

প্রথম সমস্যাটি হ'ল আপনি ফাউন্ডেশনে ব্রিজ করছেন contains(সুইফটস Stringএ নয় Collection), তাই এটিNSString আচরণ, যা আমি বিশ্বাস করি না হ্যান্ডলগুলি সুইফের মতো শক্তিশালীভাবে ইমোজি রচিত। এটি বলেছে, সুইফ্ট আমি বিশ্বাস করি যে এই মুহূর্তে ইউনিকোড 8 বাস্তবায়ন করা হচ্ছে, যার জন্য ইউনিকোড 10-এ এই পরিস্থিতিটি সম্পর্কেও পুনর্বিবেচনার প্রয়োজন হয়েছিল (সুতরাং তারা যখন ইউনিকোড 10 বাস্তবায়ন করবেন তখন এটি পরিবর্তিত হতে পারে; আমি এটি খনন করি নি কি না)।

জিনিসটিকে সরল করার জন্য আসুন আমরা ফাউন্ডেশন থেকে মুক্তি পাব এবং সুইফট ব্যবহার করি যা আরও স্পষ্টত এমন মতামত সরবরাহ করে। আমরা অক্ষর দিয়ে শুরু করব:

"👩‍👩‍👧‍👦".characters.forEach { print($0) }
👩‍
👩‍
👧‍
👦

ঠিক আছে. আমাদের প্রত্যাশাও তাই ছিল। তবে এটি মিথ্যা। আসুন দেখা যাক সেই চরিত্রগুলি আসলে কী।

"👩‍👩‍👧‍👦".characters.forEach { print(String($0).unicodeScalars.map{$0}) }
["\u{0001F469}", "\u{200D}"]
["\u{0001F469}", "\u{200D}"]
["\u{0001F467}", "\u{200D}"]
["\u{0001F466}"]

আহ… তো তাই ["👩ZWJ", "👩ZWJ", "👧ZWJ", "👦"] । এটি সবকিছুকে আরও স্পষ্ট করে তোলে। This এই তালিকার সদস্য নয় (এটি "👩ZWJ"), তবে 👦 একজন সদস্য।

সমস্যাটি হ'ল Characterএকটি "গ্রাফি ক্লাস্টার", যা একসাথে জিনিসগুলি রচনা করে (যেমন জেডডাব্লুজেজে সংযুক্ত করা)। আপনি যা সত্যই সন্ধান করছেন তা হ'ল একটি ইউনিকোড স্কেলার। এবং এটি আপনার প্রত্যাশা মতো ঠিক কাজ করে:

"👩‍👩‍👧‍👦".unicodeScalars.contains("👩") // true
"👩‍👩‍👧‍👦".unicodeScalars.contains("\u{200D}") // true
"👩‍👩‍👧‍👦".unicodeScalars.contains("👧") // true
"👩‍👩‍👧‍👦".unicodeScalars.contains("👦") // true

এবং অবশ্যই আমরা সেখানে প্রকৃত চরিত্রের সন্ধান করতে পারি:

"👩‍👩‍👧‍👦".characters.contains("👩\u{200D}") // true

(এটি বেন লেগিজিরোর পয়েন্টগুলিকে ভারীভাবে নকল করে he


Wth ZWJদাঁড়ানো কি?
লিনাসগেফার্থ

2
শূন্য প্রস্থের যোজক
রব নেপিয়ার

সুইফট 4-এ @ রবনাপিয়ার, Stringঅভিযোগের পরিবর্তে সংগ্রহের ধরণে পরিবর্তন করা হয়েছিল। এটি কি আপনার উত্তরকে আদৌ প্রভাবিত করে?
বেন লেগিগিরো

75

দেখে মনে হচ্ছে সুইফট ZWJচরিত্রটির সাথে সাথে এর আগেই তার প্রসারিত গ্রাফিম ক্লাস্টার হিসাবে বিবেচনা করে। অক্ষরের অ্যারে ম্যাপ করার সময় আমরা এটি দেখতে পারি unicodeScalars:

Array(manual.characters).map { $0.description.unicodeScalars }

এটি এলএলডিবি থেকে নিম্নলিখিতটি মুদ্রণ করে:

4 elements
  ▿ 0 : StringUnicodeScalarView("👩‍")
    - 0 : "\u{0001F469}"
    - 1 : "\u{200D}"1 : StringUnicodeScalarView("👩‍")
    - 0 : "\u{0001F469}"
    - 1 : "\u{200D}"2 : StringUnicodeScalarView("👧‍")
    - 0 : "\u{0001F467}"
    - 1 : "\u{200D}"3 : StringUnicodeScalarView("👦")
    - 0 : "\u{0001F466}"

অতিরিক্তভাবে, .containsগোষ্ঠীগুলি গ্রাফিম ক্লাস্টারগুলিকে একটি একক অক্ষরে প্রসারিত করে। উদাহরণস্বরূপ, হাঙ্গুল অক্ষর গ্রহণ , এবং (যা "এক" এর জন্য কোরিয়ান শব্দ করতে একত্রিত: 한):

"\u{1112}\u{1161}\u{11AB}".contains("\u{1112}") // false

এটি খুঁজে পেল না কারণ তিনটি কোডপয়েন্টগুলি একটি ক্লাস্টারে বিভক্ত হয়েছে যা একটি চরিত্র হিসাবে কাজ করে। একইভাবে, \u{1F469}\u{200D}( WOMAN ZWJ) একটি ক্লাস্টার, যা একটি চরিত্র হিসাবে কাজ করে।


19

অন্যান্য উত্তরগুলি সুইফট কী করে তা নিয়ে আলোচনা করে তবে কেন তা নিয়ে বেশি বিশদে যাবেন না।

আপনি কি "Å" সমান "Å" আশা করেন? আমি আপনাকে আশা করি।

এর মধ্যে একটি হ'ল একটি সংযোগকারী সহ একটি চিঠি, অন্যটি একক রচিত চরিত্র। আপনি বেস চরিত্রে অনেকগুলি বিভিন্ন সংযুক্তকারী যুক্ত করতে পারেন এবং একটি মানুষ এখনও এটিকে একটি একক চরিত্র হিসাবে বিবেচনা করবে। এই ধরণের তাত্পর্য মোকাবিলার জন্য গ্রাফিমের ধারণাটি তৈরি হয়েছিল যা ব্যবহৃত কোডডপয়েন্ট নির্বিশেষে কোনও মানুষ কোনও চরিত্র বিবেচনা করবে তা উপস্থাপনের জন্য তৈরি করা হয়েছিল।

এখন টেক্সট মেসেজিং সেবা বছরের জন্য গ্রাফিকাল ইমোজি মধ্যে অক্ষর মিশ্রন করা হয়েছে :) →  🙂। তাই ইউনিকোডে বিভিন্ন ইমোজি যুক্ত হয়েছিল।
এই পরিষেবাগুলি ইমোজিগুলিকে একত্রে মিশ্র ইমোজি যুক্ত করতে শুরু করে।
অবশ্যই পৃথক কোডপয়েন্টগুলিতে সমস্ত সম্ভাব্য সংমিশ্রণগুলি এনকোড করার কোনও যুক্তিসঙ্গত উপায় নেই, সুতরাং ইউনিকোড কনসোর্টিয়াম এই সংমিশ্রিত অক্ষরগুলিকে অন্তর্ভুক্ত করার জন্য গ্রাফিক্সের ধারণাটি প্রসারিত করার সিদ্ধান্ত নিয়েছে।

আপনি "👩‍👩‍👧‍👦"যদি গ্রাফেম স্তরে এটির সাথে কাজ করার চেষ্টা করছেন, যেমন সুইফট ডিফল্টরূপে করে তবে এইটিকে কী উত্থিত হবে তা একক "গ্রাফিম ক্লাস্টার" হিসাবে বিবেচনা করা উচিত।

যদি আপনি এটির "👦"অংশ হিসাবে রয়েছে কিনা তা পরীক্ষা করতে চান তবে আপনার নীচের স্তরে চলে যেতে হবে।


আমি সুইফট সিনট্যাক্সটি জানি না তাই এখানে কিছু পার্ল 6 রয়েছে যা ইউনিকোডের জন্য সমান স্তর সমর্থন করে।
(পার্ল 6 ইউনিকোড সংস্করণ 9 সমর্থন করে যাতে তাত্পর্য হতে পারে)

say "\c[family: woman woman girl boy]" eq "👩‍👩‍👧‍👦"; # True

# .contains is a Str method only, in Perl 6
say "👩‍👩‍👧‍👦".contains("👩‍👩‍👧‍👦")    # True
say "👩‍👩‍👧‍👦".contains("👦");        # False
say "👩‍👩‍👧‍👦".contains("\x[200D]");  # False

# comb with no arguments splits a Str into graphemes
my @graphemes = "👩‍👩‍👧‍👦".comb;
say @graphemes.elems;                # 1

আসুন একটি স্তর নীচে যান

# look at it as a list of NFC codepoints
my @components := "👩‍👩‍👧‍👦".NFC;
say @components.elems;                     # 7

say @components.grep("👦".ord).Bool;       # True
say @components.grep("\x[200D]".ord).Bool; # True
say @components.grep(0x200D).Bool;         # True

এই স্তরে নিচে নামা কিছু জিনিসকে আরও শক্ত করে তুলতে পারে।

my @match = "👩‍👩‍👧‍👦".ords;
my $l = @match.elems;
say @components.rotor( $l => 1-$l ).grep(@match).Bool; # True

আমি ধরে নিয়েছি যে .containsসুইফটে এটি সহজ করে তোলে, তবে এর অর্থ এই নয় যে এমন অন্যান্য জিনিস নেই যা আরও বেশি কঠিন হয়ে ওঠে।

এই স্তরে কাজ করা উদাহরণস্বরূপ কোনও সংমিশ্রিত চরিত্রের মাঝখানে ঘটনাক্রমে একটি স্ট্রিং বিভক্ত করা আরও সহজ করে তোলে।


আপনি অজান্তে যা জিজ্ঞাসা করছেন তা হ'ল এই উচ্চ স্তরের প্রতিনিধিত্ব নিম্ন স্তরের প্রতিনিধিত্বের মতো কেন কাজ করে না। উত্তর অবশ্যই, এটি করা উচিত নয়।

আপনি যদি নিজেকে জিজ্ঞাসা করছেন " কেন এটি এত জটিল হতে হবে ", উত্তর অবশ্যই অবশ্যই " মানুষ "।


4
আপনি আপনার শেষ উদাহরণ লাইনে আমাকে হারিয়েছেন; কি rotorএবং grepকি এখানে আছে? আর কী 1-$l?
বেন লেগিগিরো

4
"গ্রাফি" শব্দটি কমপক্ষে 50 বছরের পুরানো। ইউনিকোড এটিকে স্ট্যান্ডার্ডের সাথে পরিচয় করিয়ে দেয় কারণ তারা ইতিমধ্যে "চরিত্র" শব্দটি ব্যবহার করেছিল যার অর্থ কেউ সাধারণত চরিত্র হিসাবে যা ভাবেন তার থেকে কিছু আলাদা different আপনি যা লিখেছিলেন সেটির সাথে সামঞ্জস্যপূর্ণ হিসাবে আমি পড়তে পারি তবে সন্দেহ হয় যে অন্যরা ভুল ধারণাটি পেতে পারে, সুতরাং এটি (আশাবাদী স্পষ্ট করে) মন্তব্য করুন।
রায়ফ

2
@ বেনলেগজিওরো প্রথম rotor,। কোড say (1,2,3,4,5,6).rotor(3)ফলন ((1 2 3) (4 5 6))। অর্থাৎ তালিকার একটি তালিকা প্রতিটি দৈর্ঘ্য 3say (1,2,3,4,5,6).rotor(3=>-2)দ্বিতীয় sublist শুরু ব্যতীত একই উৎপাদ 2বদলে 4, তৃতীয় 3, ইত্যাদি, ফলনশীল ((1 2 3) (2 3 4) (3 4 5) (4 5 6))। যদি @matchথাকে "👩‍👩‍👧‍👦".ordsতবে @ ব্র্যাডের কোডটি কেবল একটি সাবলিস্ট তৈরি করে, তাই বিটটি =>1-$lঅপ্রাসঙ্গিক (অব্যবহৃত)। এর @matchচেয়ে খাটো হলেই এটি প্রাসঙ্গিক @components
রায়ফ

1
grepপ্রত্যেকটি উপাদানকে তার ইনভোক্যান্টের সাথে মিলানোর চেষ্টা করে (এই ক্ষেত্রে, এর তালিকাভুক্তির একটি তালিকা @components)। এটি প্রতিটি উপাদানকে তার ম্যাচারের যুক্তিটির সাথে মেলে ধরার চেষ্টা করে (এই ক্ষেত্রে, @match)। .Boolতারপর আয় Trueiff grepঅন্তত একটি ম্যাচ উৎপন্ন হয়।
রায়ফ

18

সুইফট 4.0 আপডেট

স্ট্রিং SE-0163 নথি হিসাবে সুইফট 4 আপডেটে প্রচুর সংশোধনী পেয়েছে । দুটি ডেমো দুটি ভিন্ন কাঠামোর প্রতিনিধিত্ব করে এই ডেমো জন্য ব্যবহৃত হয়। উভয় ইমোজি একটি ক্রম সঙ্গে মিলিত হয়।

👍🏽দুটি ইমোজি, 👍এবং এর সমন্বয়🏽

👩‍👩‍👧‍👦চারটি ইমোজি এর সংমিশ্রণ, শূন্য প্রস্থের সংযোগকারী যুক্ত। বিন্যাসটি হ'ল👩‍joiner👩‍joiner👧‍joiner👦

1. গণনা

সুইফ্ট ৪.০-তে ইমোজি গ্রাফেমি ক্লাস্টার হিসাবে গণনা করা হয়। প্রতিটি একক ইমোজি 1 হিসাবে গণনা করা হয় countসম্পত্তি স্ট্রিংয়ের জন্য সরাসরি উপলব্ধ। সুতরাং আপনি সরাসরি এটি কল করতে পারেন।

"👍🏽".count  // 1. Not available on swift 3
"👩‍👩‍👧‍👦".count  // 1. Not available on swift 3

একটি স্ট্রিং এর চরিত্রের অ্যারেটি সুইফট ৪.০ এ গ্রাফিম ক্লাস্টার হিসাবেও গণ্য করা হয়, সুতরাং নিম্নলিখিত কোডগুলি দুটি মুদ্রণ করে 1. এই দুটি ইমোজি ইমোজি সিকোয়েন্সগুলির উদাহরণ, যেখানে বেশ কয়েকটি ইমোজি \u{200d}তাদের মধ্যে শূন্য প্রস্থের সংযুক্তকারীর সাথে বা তার সাথে মিলিত হয় । সুইফ্ট ৩.০-তে, এই জাতীয় স্ট্রিংয়ের চরিত্রের অ্যারে প্রতিটি ইমোজি আলাদা করে এবং একাধিক উপাদান (ইমোজি) সহ অ্যারে তৈরি করে। এই প্রক্রিয়াটিতে যোগদানকারীকে উপেক্ষা করা হয়। যাইহোক, সুইফট ৪.০-এ, অক্ষর অ্যারে সমস্ত ইমোজিগুলিকে এক টুকরো হিসাবে দেখবে। সুতরাং যে কোনও ইমোজি সর্বদা 1 হবে।

"👍🏽".characters.count  // 1. In swift 3, this prints 2
"👩‍👩‍👧‍👦".characters.count  // 1. In swift 3, this prints 4

unicodeScalars এটি সুইফট ৪-এ অপরিবর্তিত রয়েছে It এটি প্রদত্ত স্ট্রিংয়ে স্বতন্ত্র ইউনিকোড অক্ষর সরবরাহ করে।

"👍🏽".unicodeScalars.count  // 2. Combination of two emoji
"👩‍👩‍👧‍👦".unicodeScalars.count  // 7. Combination of four emoji with joiner between them

2. ধারণ করে

সুইফট ৪.০ এ, containsপদ্ধতি ইমোজিগুলিতে শূন্য প্রস্থের সংযুক্তিকে উপেক্ষা করে। সুতরাং এটি চারটি ইমোজি উপাদানগুলির যে কোনওটির ক্ষেত্রেই সত্য প্রত্যাবর্তন করে "👩‍👩‍👧‍👦"এবং আপনি যদি সংযুক্তকারীর জন্য পরীক্ষা করে থাকেন তবে এটি মিথ্যা প্রত্যাবর্তন করে। যাইহোক, সুইফ্ট ৩.০-তে, সংযুক্তকারীটিকে অগ্রাহ্য করা হবে না এবং এর সামনে ইমোজি যুক্ত করা হবে। সুতরাং যখন আপনি "👩‍👩‍👧‍👦"প্রথম তিনটি উপাদান ইমোজি রয়েছে কিনা তা পরীক্ষা করেন , ফলাফলটি মিথ্যা হবে

"👍🏽".contains("👍")       // true
"👍🏽".contains("🏽")        // true
"👩‍👩‍👧‍👦".contains("👩‍👩‍👧‍👦")       // true
"👩‍👩‍👧‍👦".contains("👩")       // true. In swift 3, this prints false
"👩‍👩‍👧‍👦".contains("\u{200D}") // false
"👩‍👩‍👧‍👦".contains("👧")       // true. In swift 3, this prints false
"👩‍👩‍👧‍👦".contains("👦")       // true

0

ইমোজিস, অনেকটা ইউনিকোড স্ট্যান্ডার্ডের মতো, ছদ্মবেশী জটিল। স্কিন টোন, জেন্ডার, জবস, লোকেদের গ্রুপ, শূন্য প্রস্থের জোয়ার সিকোয়েন্সস, ফ্ল্যাগস (২ টি চরিত্রের ইউনিকোড) এবং অন্যান্য জটিলতা ইমোজি পার্সিং অগোছালো করতে পারে। একটি ক্রিসমাস ট্রি, একটি স্লাইস পিজ্জা বা একটি পাইল অফ পোওপ সবই একক ইউনিকোড কোড পয়েন্টের সাথে উপস্থাপিত হতে পারে। নতুন ইমোজিগুলি চালু করার সময়, আইওএস সমর্থন এবং ইমোজি রিলিজের মধ্যে বিলম্ব হয় তা উল্লেখ করার দরকার নেই। এটি এবং আইওএসের বিভিন্ন সংস্করণ ইউনিকোড স্ট্যান্ডার্ডের বিভিন্ন সংস্করণকে সমর্থন করে।

টি এল; ডিআর। আমি এই বৈশিষ্ট্যগুলিতে কাজ করেছি এবং ইমোজিগুলির সাহায্যে স্ট্রিংগুলি পার্স করতে সহায়তা করার জন্য আমি জে কে ইমোজি'র লেখক sour এটি পার্সিংকে এত সহজ করে তোলে:

print("I love these emojis 👩‍👩‍👧‍👦💪🏾🧥👧🏿🌈".emojiCount)

5

এটি নিয়মিতভাবে সর্বশেষ স্বীকৃত সংস্করণ হিসাবে সর্বজন স্বীকৃত ইমোজিদের স্থানীয় ডাটাবেসকে রিফ্রেশ করে ( সম্প্রতি হিসাবে 12.0 ) এবং বিটম্যাপ উপস্থাপনাটি দেখে চলমান ওএস সংস্করণে বৈধ ইমোজি হিসাবে স্বীকৃত হিসাবে তাদের ক্রস-রেফারেন্স করে একটি অচেনা ইমোজি চরিত্র।

বিঃদ্রঃ

পূর্ববর্তী উত্তরটি আমার লেখক হিসাবে স্পষ্টভাবে উল্লেখ না করে আমার লাইব্রেরির বিজ্ঞাপনের জন্য মুছে ফেলা হয়েছে। আমি আবার এটি স্বীকার করছি।


2
আমি যখন আপনার লাইব্রেরি দ্বারা মুগ্ধ হয়েছি এবং আমি দেখতে পাচ্ছি যে এটি সাধারণত বিষয়টির সাথে কীভাবে সম্পর্কিত হয় তবে আমি দেখতে পাই না যে এটি সরাসরি প্রশ্নের সাথে কীভাবে
জড়িত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.