char türünün UTF-8 kod birimi (code unit) olduğunu biliyorsunuz. Kod birimi, Unicode karakterleri oluşturan birim anlamına geliyor. Örneğin 'ğ' harfi UTF-8'de iki kod biriminden oluşur. (Kod noktası (code point) ise karakterin kendisini ifade eden koddur.)
Code point (kod noktası): Unicode'un her bir dünya karakterine atadığı kod. Örneğin ğ'nin kod noktası Unicode gösteriminde U+011E'dir. O değeri on altılı düzenden çevirirsek, 286'dır.
Code unit (kod birimi): Her bir karakterin, belirli bir Unicode kodlamasındaki bir birimdir. Örneğin ğ harfi UTF-8 kodlamasında iki adet 8-bit olarak temsil edilir: onaltılı olarak c4 ve 9f (onlu düzende 196 ve 159). İşte bunların her birisi kod birimidir.
string'in elemanlarına kendimiz teker teker erişirsek, kod birimlerini görürüz:
import std.stdio;
void main()
{
writeln("\nUnicode kod birimi (code unit) olarak:");
foreach (kodBirimi; "ağb"c) {
writeln(kodBirimi);
}
}
Çıktısı, ğ'yi iki kod birimi olarak gösterir:
Unicode kod birimi (code unit) olarak:
a
?
?
b
(Bu forumda yanlış bir şeyler görünmesin diye ben elle "?" yazdım.)
Oysa, string'i bir aralık olarak kullanırsak, kod noktalarına, yani Unicode karakterlerine erişiriz:
import std.stdio;
import std.range;
void main()
{
writeln("\nUnicode karakteri (code point) olarak:");
for (string dizgi = "ağb"c; !dizgi.empty; dizgi.popFront()) {
writeln(dizgi.front);
}
}
Çıktısı:
Unicode karakteri (code point) olarak:
a
ğ
b
Yaşasın aralıklaaar! :D
Ama daha foreach ile kullanmayı bilmiyorum. Örneğin ters sırada ilerlemek için retro kullanıldığında foreach ile güzelce çalışıyor:
import std.stdio;
import std.range;
void main()
{
writeln("\nUnicode karakteri (code point) olarak ters sırada:");
foreach (karakter; retro("ağb"c)) {
writeln(karakter);
}
}
UTF-8 kodlamasını akıllıca geriye doğru ilerliyor ve beklenen çıktıyı oluşturuyor:
Unicode karakteri (code point) olarak ters sırada:
b
ğ
a
foreach ile düz ilerlemeyi de öğrenmeliyiz... :)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply