Unicode Harmanlama Algoritması

Unicode Harmanlama Algoritması (kısa TDM ) 'dir Unicode Konsorsiyumu yayınlanan algoritma için dizeleri gelen Unicode karakter karşılaştırmak ve böylece etmek alfabetik olması . Kasıtlı olarak o kadar açık tutulur ki, dile özgü özellikler ve özel kullanıcı istekleri dikkate alınabilir. Algoritma için standart değerlere sahip bir tablo, Varsayılan Unicode Harmanlama Öğesi Tablosu (DUCET) da mevcuttur. Ek olarak, Ortak Yerel Veri Havuzu , örneğin YBÜ projesinin uygulanmasında kullanılan diğer birçok dil için karşılık gelen tablolar sağlar .

koşullar

Unicode'da kodlanan çok sayıda karakter, dizelerin sıralanmasını zorlaştırır. Örneğin, Yunan harflerinden yapılan kelimelerin Kiril harflerinden önce mi yoksa tam tersi mi olması gerektiği açık değildir . Tek tek karakterlerin kodlanma sırası her zaman istenen sıralama düzenine karşılık gelmez.

Farklı dillerde, münferit harflerin sırası hakkında farklı fikirler vardır. Örneğin, Almanca sözlüklerde å ile sözcükler sıradan bir a varmış gibi sıralanır, İskandinav dillerinde ise å z'den sonra gelen ayrı bir harftir. Bu tür farklılıklar bir dilde bile ortaya çıkabilir, örneğin Almanca'da, burada ä bazen a, bazen ae gibi ele alınır.

Ayrıca, tek tek karakterlere göre sıralamak kolay değildir. Gelen geleneksel İspanyolca , digraph ch c ve d arasındaki gelir ayrı harf olarak kabul edilir.

Ayrıca, uygulamaya bağlı olarak belirli ek gereksinimler yapılabilir, örneğin Noel Baba gibi St.

hikaye

Algoritmanın yazarları Mark Davis ve Ken Whistler'dır. İlk versiyon 30 Mart 1997'de yayınlandı. Eylül 2012 itibarıyla algoritmanın 26 sürümü kullanıma sunulmuştur. İle ISO 14651 benzer bir algoritma var ISO ancak daha az sayıda olanaklar sunmaktadır. Daha yeni sürümlerle, sayıları sayısal olarak sıralama gibi daha fazla yapılandırma seçeneği eklenmiştir.

algoritma

İki dizgiyi karşılaştırmak için, algoritma farklı adımlarla ilerler ve iki dizgiyi farklı seviyelerde karşılaştırır. Seviyelerin sayısı ve anlamı prensipte serbestçe seçilebilir, ancak standart aşağıdaki anlamlara sahip üç seviyedir:

Seviye 1: temel harfler

Birinci seviyede karakter dizileri temel harflerine göre karşılaştırılır. Aksanlar, büyük ve küçük harf, noktalama işaretleri ve benzerleri genellikle göz ardı edilir. Yani bu seviyede çöp ve çöp kelimeleri aynı kabul edilir, ancak katır kelimesi onlardan önce gelir.

Seviye 2: aksanlar

Kelimeler temel harflerle eşleşiyorsa, sonraki adım aksanları karşılaştırmaktır. Hemen hemen tüm dillerde, ilk fark soldan sağa aranır ve sonra sabit bir sıraya göre sıralanır: önce aksansız harfler, diğer aksanlar sabit bir sırayla. Bu, cote - coté - côte - côté siparişiyle sonuçlanır. Kanada Fransızcası bir istisnadır: geleneksel olarak, son fark burada sıralanır: cote - côte - coté - côté.

Seviye 3: büyük ve küçük harf

Kelimeler aksanlarda da uyuyorsa, büyük ve küçük harfler kullanılır, burada küçük harfler genellikle büyük harflerden önce sıralanır.

Daha fazla seviye

Gerekirse, daha ince bir farklılaşma sağlamak için daha ileri seviyeler izlenebilir. Çoğunlukla sonuç, bireysel kod noktalarına göre sıralanır. Bu, iki farklı dizenin her zaman aynı sırada sıralanmasını sağlar.

Ağırlıkları sıralama

Karakter dizilerini karşılaştırmak için algoritma, Unicode karakterlerinden oluşan bir karakter dizisi için bir ikili sıralama anahtarı sağlar. Bu anahtar daha sonra karşılaştırma için gerçek sıralama algoritmasında kullanılır . Sıralama anahtarını belirlemek için, harmanlama elemanı tablosu olarak adlandırılan, tüm seviyeler için tek tek karakterler için ikili ağırlıkları veya karakter kombinasyonlarını listeleyen bir tablo kullanılır . Bir girişe seviye başına birkaç ağırlık atanabilir. Ağırlık 0000, karşılık gelen karakterin bu düzeyde göz ardı edilmesi gerektiği anlamına gelir. Tabloda listelenmeyen karakterler için bir ağırlık hesaplanmalıdır. Standart tablo için bu sadece CJKV karakterleri için geçerlidir ; ağırlıkların hesaplanması için bir algoritma da verilmiştir.

İlk olarak, karakter dizisi mümkün olduğu kadar uzun süre parçalara bölünür, bunlar tabloda bir girişi vardır ve ilgili ağırlıklar tablodan okunur. Bu ağırlıklar başlangıçta her seviye için birbirine eklenir ve çıkarılır 0000. Kanada-Fransız sıralaması için 2. düzeydeki sıra tersine çevrilir. Ayrı seviyelerin anahtarları nihayet 0000tek bir sıralama anahtarı oluşturmak için birbirine eklenir.

Örnekler

Bir harmanlama öğesi tablosundaki girişler için bu örneklerin çoğu DUCET 6.1.0 sürümünden alınmıştır. İlk üç seviyenin ağırlıkları burada onaltılık sayılar olarak verilmiştir . Ağırlıklar nokta ile ayrılır ve köşeli parantez içine alınır.

Basit harfler

karakter Ağırlıklar açıklama
a [15D4.0020.0002] 15D4 a temel harfinin ağırlığıdır.
A. [15D4.0020.0008] Büyük A, üçüncü düzeydeki küçük a'dan farklıdır.
b [15EA.0020.0002] 15EA b temel harfinin ağırlığıdır, bu a'dan sonra gelir (kullanıcıya özel eklemeler için biraz boşluk bırakarak).
c [1602.0020.0002]
z [187A.0020.0002]
α [190E.0020.0002] Latin alfabesinin harflerini, Yunan alfabesi gibi diğer alfabelerin harfleri izler.

Aksanlı harfler, bitişik harfler ve harf kombinasyonları

Aksan işaretli harfler, temel bir karaktere ve aşağıdaki birleşik karakterlere ayrılır .

karakter Ağırlıklar açıklama
à [15D4.0020.0002], [0000.0035.0002] A için ağırlığın ardından 1. seviyede ( ) dikkate alınmayan mezar aksanının ağırlığı gelir 0000.
å [15D4.0020.0002], [0000.0043.0002] Normalde å, a'nın bir varyantı olarak yorumlanır.
å [187B.0020.0002] Gelen İsveççe farklı bir ağırlık burada, ikinci bir z sonra ayrı bir harfi olarak izler.
Ä [15D4.0020.0002], [0000.0047.0002]
æ [15D4.0020.0004], [0000.0139.0004], [1631.0020.001F] æ birinci seviyede ae gibi ele alınır.
ch [1603.0020.0002] Geleneksel İspanyolcada ch, c'den sonra gelen bir harf gibi ele alınır.

Kontrol karakterleri, sembolleri ve rakamları

karakter Ağırlıklar açıklama
LRM [0000.0000.0000] Gibi kontrol karakterleri B. soldan sağa karakterler tamamen yok sayılır.
$ [15A4.0020.0002]
[15BC.0020.0002]
1 [15CB.0020.0002]
2 [15CC.0020.0002]
² [15CC.0020.0014] Büyük harfler gibi, üst simge rakamları da yalnızca üçüncü seviyedeki temel rakamdan farklıdır.
9 [15D3.0020.0002]

Noktalama işaretleri ve boşluklar

Noktalama işaretleri ve boşluklar için, ağırlıkları seçmek için çeşitli seçenekler vardır.

PHP gibi birçok uygulamada, bu karakterler tabloda gösterildiği gibi ağırlıklandırılır.

karakter Ağırlıklar açıklama
sıradan alan [020A.0020.0002]
kırılmaz alan [020A.0020.001B] Bölünmeyen boşluk sadece 3. seviyede normalden ayırt edilir.
Kısa çizgi-eksi (-) [020E.0020.0002]
Noktalı virgül (-) [0216.0020.0002]
Virgül (,) [0221.0020.0002]
İki nokta üst üste (:) [0237.0020.0002]
Ünlem işareti (!) [025E.0020.0002]
Dönem (.) [0273.0020.0002]
Kesme işareti (') [02EA.0020.0002]
Kesme işareti (') [02EC.0020.0002]
Tırnak işaretleri (") [02F1.0020.0002]
Alıntı işaretleri (") [02F2.0020.0002]
Alıntı işaretleri (") [02F4.0020.0002]
açılış ayracı (() [02FB.0020.0002]
kapanış ayracı ()) [02FC.0020.0002]
Eğik çizgi (/) [0372.0020.0002]

İlk plan, bu karakterleri hiçbir şekilde standart davranış olarak görmemek, yani onlara kontrol karakterleri gibi ağırlık [0000.0000.0000]vermekti.

Algoritmanın şu anki sürümünde, standart davranışa benzer bir şey gereklidir: Burada da ağırlık [0000.0000.0000]seçilir, ancak seviye 1 için gerçekte belirtilen değerin ağırlık olarak kullanıldığı dördüncü bir seviye eklenirken diğer karakterler bu seviyedeki değeri kullanın, mümkün olan en yüksek değeri elde edin FFFF.

Kullanıcının aralarından seçim yapabileceği başka varyantlar da vardır.

Adaptasyon

Standart tablo birçok şekilde özelleştirilebilir:

  • Bireysel ağırlıklarda dile özgü değişiklikler yapılabilir ve ağırlıklarla ilave karakter kombinasyonları eklenebilir. Uygun şekilde uyarlanmış tablolar halihazırda birçok dil için mevcuttur. Belirlenecek kullanıcı tanımlı ayarlamalar için ayrı bir sözdizimi vardır ve bu, uygun programlar tarafından uygun sıralama ağırlıklarıyla bir tabloya çevrilebilir.
  • Gerekirse, Kanada Fransızcasında alışılageldiği gibi, sıralamanın karakter dizisinin sonundan itibaren ikinci seviyede gerçekleştirilmesi gerektiğini belirtebilirsiniz. Prensip olarak, mantıklı gelmese bile bu diğer seviyeler için de mümkündür.
  • Karşılaştırmanın gerçekleşmesi gereken düzeylerin sayısını seçebilirsiniz. Bu sayı, güç olarak bilinir. Varsayılan 3'tür, ancak tablo daha fazla seviye için ağırlık gösteriyorsa daha büyük bir sayı seçilebilir. Bununla birlikte, kısa bir sıralama anahtarının ayrıntılı bir sıralamaya göre önceliği varsa, daha küçük bir sayı da seçilebilir.
  • Belirli karakterler için (çoğunlukla boşluklar ve noktalama işaretleri), ağırlıklar için farklı değişkenler arasından seçim yapabilirsiniz.

Standart, diğer birçok seçeneği açıklamaktadır.

varyantlar

Algoritmayı değiştirmenin çeşitli yöntemleri vardır, örneğin daha kısa ikili anahtarlar elde etmek için. Bu yüzden 0000ağırlıklar seviyeden seviyeye düştüğü sürece ayırıcılar olmadan yapmak mümkündür . Daha fazla tasarruf sağlayan başka varyantlar da vardır.

misal

Terimleri Nina , Nino , NINO , Nino ve Ninu koymak edilecek alfabetik sırayla. Ayrı ayrı harflere ayrılırlar, ağırlıkları belirlenir ve ardından sıralama anahtarı bir araya getirilir. Tuşta birinci seviyeye ait kısım mavi ile vurgulanır, ikinci seviye yeşil, üçüncüsü sarıdır.

Nina önce gelir, kelime zaten birinci seviyede aşağıdaki Nino kelimesinden (altını çizerek) farklıdır. Bu da ilk iki seviyede NINO ile aynı fikirde; sadece üçüncü seviyede bir fark ortaya çıkıyor. Bir sonraki Niño kelimesiyle, anahtar, ikinci ve üçüncü seviyelerdeki tilde nedeniyle diğer kelimelerden daha uzundur; bu tilde aynı zamanda bir önceki kelimeden ilk farkı da sağlar. Sonuncusu, yine birinci seviyede önceki sözcüklerden farklı olan Ninu gelir.

Bu kelimeleri kod noktalarına göre sıralarsanız, bunun yerine NINO - Nina - Nino - Ninu - Niño dizisi ortaya çıkar.

kelime demonte Sıralama anahtarı
Nina N ben n a 1734.16B2.1734.15D4.0000.0020.0020.0020.0020.0000.0008.0002.0002.0002
[1734.0020.0008] [16B2.0020.0002] [1734.0020.0002] [15D4.0020.0002]
Nino N ben n Ö 1734.16B2.1734.1756.0000.0020.0020.0020.0020.0000.0008.0002.0002.0002
[1734.0020.0008] [16B2.0020.0002] [1734.0020.0002] [1756.0020.0002]
NINO N BEN. N Ö 1734.16B2.1734.1756.0000.0020.0020.0020.0020.0000.0008.0008.0008.0008
[1734.0020.0008] [16B2.0020.0008] [1734.0020.0008] [1756.0020.0008]
Niño N ben ñ Ö 1734.16B2.1734.1756.0000.0020.0020.0020.004E.0020.0000.0008.0002.0002.0002.0002
[1734.0020.0008] [16B2.0020.0002] [1734.0020.0002], [0000.004E.0002] [1756.0020.0002]
Ninu N ben n sen 1734.16B2.1734.181B.0000.0020.0020.0020.0020.0000.0008.0002.0002.0002
[1734.0020.0008] [16B2.0020.0002] [1734.0020.0002] [181B.0020.0002]

Arama algoritması

Algoritmanın bazı bölümleri metin aramaları için de kullanılabilir , örneğin ss için yapılan bir aramanın aynı zamanda ß içeren kelimeleri bulması gerekiyorsa. Bu durumda, arama kelimesi ve olası isabet ilk seviyede eşleştiğinde bir eşleşme tanınmalıdır.

İnternet linkleri

Bireysel kanıt

  1. ^ UCA'nın ilk revizyonu
  2. Unicode SSS: Harmanlama UCA ve ISO 14651 arasındaki farklar nelerdir?
  3. allkeys.txt , sürüm 6.1.0
  4. PHP kılavuzu : Collator sınıfı
  5. UCA, Sürüm 1 , Bölüm Değişken Harmanlama Öğeleri