2013-03-07 20 views
9

Bir harf veya rakam olmayan herhangi bir karakter kaldırarak dizeleri filtrelemek bir program var. Bu program, arap, Rus, Çin dahil dillerin yüksek sayıda, destek vb programı aşağıdaki gibidir:Character.isLetter'in normalleştirilmiş metne ihtiyacı var mı?

StringBuilder strBuilder = new StringBuilder(); 

for (int i = 0; i < src.length(); i++) { 
    int ch = src.codePointAt(i); 
    if (Character.isLetterOrDigit(ch)) { 
     strBuilder.appendCodePoint(ch); 
    } 
} 

yüksek ve düşük ile UTF 32 bit olarak ifade edilmiştir karakterleri desteklemek için codePointAt yöntemi kullanmak vekil. Filtrelemeyi gerçekleştirmeden önce her dizenin normalleştirilmesi gerekip gerekmediğini bilmem gerekiyor mu? Döngüyü yürütmeden önce Normalizer.normalize yöntemini çağırmaya başvuruyorum. Varsa, hangi Normalizer.Form kullanmalıyım?

Teşekkürler.

+1

Her iki durumda da, yani normalize ve normalize olmadan testler oluşturabilir ve sonuçları karşılaştıramaz mısınız? – Henrik

cevap

0

Not codepoints yineleme için kod oldukça doğru olmadığını, ben istediğiniz inanıyorum: Eğer olsa normalleştirmek veya gerekiyorsa

for(int cp, i = 0; i < s.length(); i += Character.charCount(cp)) { 
    cp = s.codePointAt(i); 
    // Process cp... 
} 

üzgün, bilmiyorum.

+0

Tamam Bu yakalama için teşekkürler. Normalizer'ı kullanmak zorunda olma konusunda bir ipucunuz var mı? – user2144762

4

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).

İlgili konular