Dizeleri Temsil Etmek için Unicode Normalleştirme kullanma

Uygulamalar, dizeleri birden çok biçimde göstermek için Unicode kullanabilir. Unicode kabulü büyüdükçe, özellikle İnternet üzerinden, Unicode dizelerindeki temel olmayan farkları ortadan kaldırma gereksinimi ortaya çıktı. Karakterlerin birleşimi için birden fazla gösterim, örneğin bir Web sunucusu bir sayfa isteğine yanıt verdiğinde veya bir bağlayıcı program bir kitaplıkta belirli bir tanımlayıcıyı aradığında, yazılımları karmaşık hale getirir.

Dikkat

Farklı Unicode dizeleri görsel olarak özdeş görünebilir ve bu da güvenlik endişelerine neden olur. Daha fazla bilgi için bkz. Güvenlik Konuları: Uluslararası Özellikler.

 

Bu gereksinime yanıt olarak, Unicode Konsorsiyumu bir karakterin eşdeğer ikili gösterimlerinden herhangi biri için bir ikili gösterim üreten "normalleştirme" adlı bir işlem tanımlamıştır. Normalleştirildikten sonra, iki dize ancak aynı ikili gösterimlere sahip oldukları takdirde eşdeğerdir. Normalleştirme bazı farklılıkları ortadan kaldırır ancak büyük/küçük harf durumunu korur.

Bir uygulama, Unicode 4.0 TR#15'e göre dizeleri yeniden düzenlemek için NormalizeString ve IsNormalizedString işlevlerini çağırarak Unicode normalleştirmeyi kullanabilir. Normalleştirme, aynı dilsel anlamı taşıyan alternatif dize gösterimlerini azaltarak güvenliğin geliştirilmesine yardımcı olabilir. Ancak, normalleştirmenin alternatif gösterimleri tamamen ortadan kaldıramayacağını unutmayın.

Normalleştirme için Unicode standartlarının ayrıntılı açıklaması için bkz. Unicode Standart Ek No. 15: Unicode Normalleştirme Formları (UAX #15).

Dikkat

Normalleştirme bir dizenin biçimini değiştirebildiğinden, güvenlik mekanizmaları veya karakter doğrulama algoritmaları genellikle normalleştirmeden sonra uygulanmalıdır. Daha fazla bilgi için bkz. Güvenlik Konuları: Uluslararası Özellikler.

 

Aynı Dizenin Birden Çok Gösterimini Sağlama

Çoğu durumda Unicode, dilsel olarak aynı dizenin birden çok gösterimine izin verir. Mesela:

  • Dieresis (umlaut) içeren Büyük A, tek bir Unicode kod noktası "Ä" (U+00C4) veya Büyük A ile birleşen Dieresis karakteri ("A" + " ̈", yani U+0041 U+0308) olarak temsil edilebilir. Benzer noktalar aksan işaretlerine sahip diğer birçok karakter için de geçerlidir.
  • Büyük A'nın kendisi normal şekilde (Latin Büyük A Harfi, U+0041) veya Fullwidth Latin Büyük A Harfi (U+FF21) ile temsil edilebilir. Benzer hususlar, diğer basit Latin harfleri (hem büyük hem de küçük harf) ve Japonca yazarken kullanılan katakana karakterleri için geçerlidir.
  • "fi" dizesi "f" ve "i" karakterleriyle (U+0066 U+0069) veya "fi" ligatürü (U+FB01) ile temsil edilebilir. Benzer hususlar, Unicode'un ligatürleri tanımladığı diğer birçok karakter bileşimi için de geçerlidir.

Dört Tanımlı Normalleştirme Formu Kullanma

Uygulamalarınız, farklı kurallara uyan "normalleştirme formları" olarak adlandırılan çeşitli algoritmalar kullanarak Unicode normalleştirme gerçekleştirebilir. Unicode Konsorsiyumu dört normalleştirme formu tanımlamıştır: NFC (form C), NFD (form D), NFKC (form KC) ve NFKD (form KD). Her bir form bazı farklılıkları ortadan kaldırır ancak büyük/küçük harf durumunu korur. Win32 ve .NET Framework dört normalleştirme formunun tümünü destekler.

NLS numaralandırma türü NORM_FORM dört standart Unicode normalleştirme formu destekler. C ve D formları, dizeler için kurallı formlar sağlar. Kurallı olmayan formlar KC ve KD daha fazla uyumluluk sağlar ve C ve D formlarında belirgin olmayan belirli anlamsal denklikleri ortaya koyabilir. Ancak, bunu belirli bir bilgi kaybından dolayı yapar ve genellikle dizeleri depolamak için kurallı bir yol olarak kullanılmamalıdır.

İki kurallı formdan C formu "oluşturulmuş" bir form, D formu ise "ayrışmış" bir formdur. Örneğin, form C tek Unicode kod noktasını "Ä" (U+00C4) kullanırken, D formu ("A" + " ̈", yani U+0041 U+0308) kullanır. "Çünkü '¨' (U+0308) birleştirme karakteridir, bunlar aynı şekilde görünür." Form D, C formu tarafından kullanılan tek bir kod noktasını temsil etmek için herhangi bir sayıda kod noktası kullanabilir.

İki dize C veya form D biçiminde özdeşse, diğer formda aynı olur. Ayrıca, doğru şekilde işlendiğinde, birbirinden ayırt edilemez şekilde ve özgün normalleştirilmemiş dizeden görüntülenirler.

Normalleştirildikten sonra dizeler tutarlı bir şekilde özgün gösterimlerine döndürülemez. Örneğin, birleştirilmiş ve ayrıştırılmış karakter gösterimlerinin karışımına sahip bir dize, normalleştirilmiş bir forma dönüştürüldüğünde, bu diziyi orijinal karma haline geri döndürmenin bir yolu yoktur. Bu nedenle, bir uygulama dizenin özgün gösterimini gerektiriyorsa, bu gösterimi açıkça depolaması gerekir. Ancak, iki kurallı form arasında dönüştürme işlemi geri döndürülebilir. C biçimindeki bir dize, önce D formuna, sonra da C formuna dönüştürülebilir ve sonuç özgün C dizesiyle aynıdır.

Form KC ve KD sırasıyla C ve D formlarına benzer, ancak bu "uyumluluk formları" her karakterin temel biçimiyle uyumlu karakterlerin ek eşlemelerine sahiptir. Bu tür eşlemeler küçük karakter varyasyonlarının kaybolmasına neden olabilir. Görsel olarak ayrı olan belirli karakterleri birleştirir. Örneğin, aynı anlamsal anlamı paylaşan tam genişlikli ve yarım genişlikli karakterleri, aynı Arapça harfin farklı biçimlerini veya ligatür "fi" (U+FB01) ve karakter çifti "fi" (U+0066 U+0069) ile birleştirirler. Ayrıca bazen üst simge olarak yazılmış, alt simge olarak yazılmış veya bir daire içine alınmış basamak gibi farklı anlamsal anlamlara sahip olabilecek bazı karakterleri birleştirir. Bu bilgi kaybı nedeniyle, formlar KC ve KD genellikle kurallı dize biçimleri olarak kullanılmamalıdır, ancak belirli uygulamalar için yararlıdır.

Form KC oluşturulmuş bir formdur ve KD formu ayrıştırılmış bir formdur. Uygulama KC ve KD formları arasında gidip gelebilir, ancak özgün dize C veya D biçiminde olsa bile KC veya KD biçiminden özgün dizeye geri dönmenin tutarlı bir yolu yoktur.

Windows, Microsoft uygulamaları ve .NET Framework genellikle normal giriş yöntemlerini kullanarak C biçiminde karakterler oluşturur. Windows'ta çoğu amaçla C formu tercih edilen formdur. Örneğin, C biçimindeki karakterler Windows klavye girişi tarafından oluşturulur. Ancak, Web'den ve diğer platformlardan içeri aktarılan karakterler veri akışına başka normalleştirme formları ekleyebilir.

Aşağıdaki örnekler UAX #15'ten alınıp dört normalleştirme biçimi arasındaki farkları göstermektedir.

Özgün Form D Form C Notlar
"Äffin" A\u0308ffin "Äffin" Kurallı eşleme değil uyumluluk eşlemesi olduğundan ffi_ligature (U+FB03) ayrıştırılmaz.${REMOVE}$
Ä\uFB03n "A\u0308\uFB03n" Ä\uFB03n
"Henry IV" "Henry IV" "Henry IV" ROMA RAKAMI IV (U+2163) ayrıştırılmaz.${REMOVE}$
Henry \u2163 Henry \u2163 Henry \u2163
Ga ka +on Ga Tek bir Japonca karakterin farklı uyumluluk eşdeğerleri C.${REMOVE}$ biçiminde aynı dizeye neden olmaz
ka +on ka +ten Ga
hw_ka +hw_ten hw_ka +hw_ten hw_ka +hw_ten
ka +hw_ten ka +hw_ten ka +hw_ten
hw_ka +ten hw_ka +on hw_ka +on
kaks k i + a m + ks f Kaks Hangul heceleri normalleştirme sırasında korunur.

 

Özgün Form KD Form KC Notlar
"Äffin" A\u0308ffin "Äffin" ffi_ligature (U+FB03) KC biçiminde ayrıştırıldı, ancak C.${REMOVE}$ biçiminde değil
Ä\uFB03n A\u0308ffin "Äffin"
"Henry IV" "Henry IV" "Henry IV" Burada elde edilen dizeler KC biçiminde aynıdır.${REMOVE}$
Henry \u2163 "Henry IV" "Henry IV"
Ga ka +on Ga Tek bir Japonca karakterin farklı uyumluluk eşdeğerleri, KC biçiminde aynı dizeyle sonuçlanır.${REMOVE}$
ka +on ka +on Ga
hw_ka +hw_ten ka +on Ga
ka +hw_ten ka +on Ga
hw_ka +on ka +on Ga
kaks k i + a m + ks f kaks Hangul heceleri normalleştirme sırasında korunur. Önceki Unicode sürümlerinde, ks f gibi jamo karakterlerinin k f + s file uyumluluk eşlemeleri vardı. Bu eşlemeler, Hangul hecelerinin korunmasını sağlamak için Unicode 2.1.9'da kaldırıldı.

 

Not

Yukarıdaki iki tablo 1998-2006 Unicode, Inc telif hakkına © sahiptir. Tüm Hakları Saklıdır.

 

Tek Glifler için Oluşturulan Formları Kullanma

Tek bir karaktere karşılık gelen birçok karakter dizisinde oluşturulmuş formlar yoktur. C formuyla normalleştirilse bile, tek bir görsel karakter veya mantıksal metin öğesi birden çok Unicode kod noktasından oluşabilir. Örneğin, Litvanca yazarken kullanılan birkaç karakterde çift diakritik işareti bulunur, çünkü bu karakterler yalnızca ayrıştırılmış formlar halinde vardır. Makro ve tilde ("ū̃", U+016b U+0303 ile küçük harfli U harfi örnek olarak verilmiştir; burada ilk kod noktası makro içeren küçük harfli bir U, ikincisi ise birleşen vurgudur).

Örnek

İlgili bir örnek NLS: Unicode Normalleştirme Örneğibulunabilir.

Ulusal Dil Desteği Kullanarak

Güvenlik Konuları: Uluslararası Özellikler

IsNormalizedString

NormalizeString