2011-08-24 22 views
18

Çok sayıda unicode karakter boyunca, ikiden fazla 'f' karakteri için U + FB00 bağlacı ff gibi birden fazla karakteri temsil eden bazıları vardır. Bu gibi karakterleri birden fazla tek karaktere dönüştürmenin kolay yolu var mı? Tercihen standart Java API'sinde mevcut bir şey var, ancak gerekirse bir dış kütüphaneye başvurabilirim.Unicode bitişik karakterleri ayırma

+1

Sorunuza * ligature * anahtar kelimesini ekleme özgürlüğünü kullandım. :) – deceze

+0

Teşekkürler - Ne aradıklarından emin değildim. :-) – nonoitall

+1

Temel birim için grafik değil mi? –

cevap

19

U + FB00 bir uyumluluk niteliğindedir. Normalde Unicode, bitişik ligatürler için ayrı bir kod noktasını desteklemez (bir bağın kullanılmasının gerekip gerekmediği ve bir verinin ne zaman saklanacağını belirleyen bir mizanpaj kararı olduğunu iddia eder). Eski kodlamalar ile birkaç birkaç, , ayrı varlıklar olarak ligatürleri temsil etmesine izin vermek için mevcuttur.

Neyse ki, bağ temsil karakterler bilgileri Unicode data file ve en yetenekli string işleme sistemlerinde mevcut veriler yerleşik olduğunu olması. Java'da

, sen the Normalizer class kullanmanız gerekir ve NFKC formu:

String ff ="\uFB00"; 
String normalized = Normalizer.normalize(ff, Form.NFKC); 
System.out.println(ff + " = " + normalized); 

Bu

ff = ff
+0

Awesome! Teşekkürler! – nonoitall

+4

@nonoitall: NFKD, her derde deva değil: bol miktarda ligatür ve diğer kombine formlar var. ** sadece çalışmaz. ** Örneğin, * ß * veya * ẞ * 'yı * SS * (hatta bir kasiyer bile var!), Ya da * Æ * * AE * ya da * æ * ila * ae * ya da * O * * OE * ya da * œ * ila * oe *. * Ð * veya * đ * değerini * o * içine * d * veya * ø * şeklinde çevirmek de işe yaramaz. ** hepsi ** için bu şeyler, UCA (Unicode Harmanlama Algoritması), ** değil ** NFKD gerekir. NFD/NFKD'nin her ikisi de, eğer bu sizin için önemliyse, tekil tahrip edici can sıkıcı özelliklere sahiptir. – tchrist

+5

@tchrist: Anlayışım, bahsettiğiniz bu ayrıştırmaların * yapılmaması gerektiğidir. Tipografik anlamda sadece basit birleştirme değil, farklı olarak kullanılan gerçek ayrı karakterler. ß *, gerektiğinde ss'ye ayrılabilir (örneğin, sadece ASCII'yi kaydedebiliyorsanız), ancak ** ** eşdeğeri değil. Diğer taraftan ff Ligatür * sadece * bir tipografik bağdır. –

1

java.text.Normalizer'u deneyebilirsiniz, ancak bu bağlantıların çalışıp çalışmadığından emin değilim.

+0

Bu bağlantı soruyu yanıtlayabilirken, cevabın temel kısımlarını buraya dahil etmek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir. - [Yorum yazıla] (/ review/düşük kaliteli yazılar/18866472) – pirho

4

Eğer Normalleştirme denir bahsediyoruz ve belirtilen süreç yazdırır Unicode Normalization Forms teknik not. Bu işlemi uygulayan java.text.Normalizer adlı Java SE sınıf kitaplığında bir sınıf var. Ancak, istediğiniz sonucu elde etmek için hangi "normalizasyon formları" nı kullanmanız gerektiğini öğrenmek için yukarıda bağlantılı Unicode belgesini okumalısınız. Bu basit değil ...

İlgili konular