Karakter π©βπ©βπ§βπ¦ (keluarga dengan dua wanita, satu perempuan, dan satu laki-laki) dikodekan sebagai berikut:
U+1F469
WOMAN
,
βU+200D
ZWJ
,
U+1F469
WOMAN
,
U+200D
ZWJ
,
U+1F467
GIRL
,
U+200D
ZWJ
,
U+1F466
BOY
Jadi itu sangat menarik dikodekan; target sempurna untuk unit test. Namun, Swift sepertinya tidak tahu bagaimana mengobatinya. Inilah yang saya maksud:
"π©βπ©βπ§βπ¦".contains("π©βπ©βπ§βπ¦") // true
"π©βπ©βπ§βπ¦".contains("π©") // false
"π©βπ©βπ§βπ¦".contains("\u{200D}") // false
"π©βπ©βπ§βπ¦".contains("π§") // false
"π©βπ©βπ§βπ¦".contains("π¦") // true
Jadi, Swift mengatakan itu berisi dirinya sendiri (baik) dan anak laki-laki (baik!). Tetapi dikatakan bahwa itu tidak mengandung seorang wanita, gadis, atau joiner dengan lebar nol. Apa yang sedang terjadi disini? Mengapa Swift tahu itu mengandung anak laki-laki tetapi bukan perempuan atau perempuan? Saya bisa mengerti jika itu diperlakukan sebagai karakter tunggal dan hanya mengenalinya mengandung dirinya sendiri, tetapi fakta bahwa ia mendapat satu subkomponen dan tidak ada yang lain membuatku bingung.
Ini tidak berubah jika saya menggunakan sesuatu seperti "π©".characters.first!
.
Yang lebih membingungkan adalah ini:
let manual = "\u{1F469}\u{200D}\u{1F469}\u{200D}\u{1F467}\u{200D}\u{1F466}"
Array(manual.characters) // ["π©β", "π©β", "π§β", "π¦"]
Meskipun saya menempatkan ZWJ di sana, mereka tidak tercermin dalam array karakter. Yang terjadi selanjutnya sedikit memberi tahu:
manual.contains("π©") // false
manual.contains("π§") // false
manual.contains("π¦") // true
Jadi saya mendapatkan perilaku yang sama dengan array karakter ... yang sangat menjengkelkan, karena saya tahu seperti apa array itu.
Ini juga tidak berubah jika saya menggunakan sesuatu seperti "π©".characters.first!
.
"π©βπ©βπ§βπ¦".contains("\u{200D}")
masih mengembalikan false, tidak yakin apakah itu bug atau fitur.