Hepsi gerçekten algoritma davranmasını istiyorum nasıl bağlıdır.
Bir örnek olarak
bize dize "a\u0308"
(U U + 0308 ᴄᴏᴍʙɪɴɪɴɢ ᴅɪᴀᴇʀᴇsɪs ardından + 0061 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴀ) "ä"
veya "\u00e4"
(U 00E4 için kanonik eşdeğerdir düşünelim ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴀ ᴡɪᴛʜ ᴅɪᴀᴇʀᴇsɪs). Kanonik olarak eşdeğer olmak, algoritmanızın bu ikisi arasında bir ayrım yapmaması gerektiği anlamına gelir. Kanonik olarak eşdeğer dizeleri aynı davranacak şekilde elde etmenin basit bir yolu, ikisini de normal kanonik normalizasyon formuna normalleştirmek: NFC veya NFD.
bu dizeleri neyi temsil bağlı olarak, uyumluluk eşdeğerlik (NFKC veya NFKD) yerine kullanmak isteyebilirsiniz. Bu genellikle, örneğin, tanımlayıcılar için tavsiye edilir. Bu iki uyumluluk karakterini önerilen eşdeğerlerine dönüştürür (U + 2126 ᴏʜᴍ sɪɢɴ U + 03A9 ɢʀᴇᴇᴋ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ᴏᴍᴇɢᴀ veya yapılı karakter dizilerine bitişik bağlayıcılar).
olursa olsun istediğiniz denklik hangi tür, prensip aynıdır: Her iki eşit normale eşdeğer dizeleri tedavi etmek istiyorsanız en basit yoldur.
Aynı davranışı tüm eşdeğer dizeler için kullandığınızda, başka bir sorunu göz önünde bulundurmanız gerekir: "karakter [ler]" in tümünü bir harf veya rakam değil "atıyorsanız, dizelerle ne olur?" "\u092C\u093F"
gibi harf ve birleştirme işaretleri ile (+ 093F ᴅᴇᴠᴀɴᴀɢᴀʀɪ ᴠᴏᴡᴇʟ sɪɢɴ ɪ U ardından U + 092C ᴅᴇᴠᴀɴᴀɢᴀʀɪ ʟᴇᴛᴛᴇʀ ʙᴀ, बि gibi görünüyor)? Bunlar iki ayrı kod noktasıdır ve U + 093F bir harf değildir. Bu ikisi herhangi bir normalizasyon formunda oluşturmazlar. Birleştirme işaretlerinin düşürülmesini istiyor musunuz (sizi leaving ile bırakıyor), ya da değil mi? bırakarak ince ise
, mevcut algoritma kullanabilirsiniz. Aksi takdirde, büyük olasılıkla, taban karakter dizileri ve bunu takip eden işaretler olan grafik kümeleri üzerinde yineleme yapmak isteyebilirsiniz.Hem Java hem de ICU, grafik kümelerini bulmak için API'ler sağlar (Java bu "karakter aralarını" çağırır).
Her iki durumda da, yani normalize ve normalize olmadan testler oluşturabilir ve sonuçları karşılaştıramaz mısınız? – Henrik