1 Mart 2011 Salı

Türkçe İçerikli Java Programları

Unicode hareketinin başlatılmasından bu yana 20 küsur yıl geçmesine rağmen ASCII karakter tablosunun etkisinden kurtulamayanlar ve İnternet'teki İngilizce kaynakları kopyalayarak programlamayı öğrenenlerin sıklıkla karşılaştığı bir sorun, kaynak kodda kullanılan tanımlayıcı adları ve karakter katarı içeriklerini (ne kuş ne deve) Türkçe ile İngilizce arasında bir dilde yazmak zorunda kalmalarıdır. Dolayısıyla, bu yazımda Türkçe içerik barındıran Java dosyalarının oluşturulup derlenmesine dair ufak bir örnek vereceğim; kendisine dert edenlere aşağıdaki programda geçen sıkıcıMesaj değişkenini İngiliz Türkçesi ile yazmak utancından nasıl kurtulunacağını anlatacağım.

TürkçeÖrnek.java
// System sınıfındaki statik metotları sınıf adı olmaksızın kullanılabilir hale getir.
import static java.lang.System.*;

public class TürkçeÖrnek {
  public static void main(String[] ksa) {
    String sıkıcıMesaj = ksa[0];

    out.println("Komut satırından vermiş olduğunuz mesaj: " + sıkıcıMesaj);
  } // void main(String[]) sonu
} // TürkçeÖrnek sınıfının sonu

Öncelikle, Türkçe'de kullanılan tüm simgeleri destekleyen ve metin düzenleyiciniz tarafından bilinen bir karakter kodlama standardı seçiniz; Türkçe simgeler içeren dosyayı diske kaydederken bu standardı kullandığınızdan emin olunuz. Bu, dosya kaydetme diyaloğunda yapılacak bir seçimle belirtilebileceği gibi, muhtemelen Ayarlar (ya da Tercihler) adına sahip bir menüden de yapılabilir.

Bu noktada, yaygınlığı ve ekonomikliği nedeniyle UTF-8'i seçmenizi tavsiye ederim. Söz konusu standart, İngilizce yazım için gerekli simgeleri ASCII standardındaki gibi tek sekizli ile temsil ederken, Unicode karakter tablosunda yer bulan diğer simgeleri iki, üç veya dört sekizlide temsil eder. Böylesine bir yaklaşım, Türkçe metinlerin yazımında yararlanılan pek çok simgenin İngilizce'dekilerle aynı olması ve Türkçe'ye özel simgelerin iki sekizli yer tutması nedeniyle, dosyanın kaplayacağı disk alanındaki (veya ağ bant genişliğindeki) artışı sınırlar.

Karakter kodlama bağlamındaki seçeneklere UTF-16, UTF-16BE, UTF-16LE,  UTF-32, UTF-32BE, UTF-32LE, iso8859-9 ve cp1254 standartlarını ekleyebiliriz. Ancak, anılan standartların UTF-8'e göre eksileri olduğu unutulmamalıdır. UTF-16, UTF-16BE ve UTF-16LE kodlamaları, yaşayan doğal dillerin yazımında kullanılan simgeleri iki, geri kalanları ise dört sekizliyle temsil ederek yerden kayba neden olacaktır. Aynı sıkıntı,  tüm simgeleri dört sekizliyle temsil eden UTF-32, UTF-32BE ve UTF-32LE kodlamaları için de geçerlidir. Ayrıca, UTF-16 veya UTF-32'nin seçilmesi durumunda, temsilde kullanılan sekizlilerin dışsallaştırılma (yani, diske yazılma veya ağa gönderilme) sırası donanım mimarileri arasında farklılık göstereceğinden, kaynak kodun taşınabilirliği azalmaktadır. Türkçe'ye özel geliştirilmiş iso8859-9 ve cp1254 standartları ise, Türkçe (ve İngilizce) dışındaki dilleri desteklememeleri ve UTF-8'e göre daha kısıtlı bir desteğe sahip olmaları nedeniyle iyi bir sebep olmadıkça seçilmemelidir.

Dosyanın diske kaydedilmesi sonrasında yapılması gereken, kayıt esnasında kullanılan kodlama standardına dair bilgiyi derleyiciye geçirmekten ibaret. Bu ise ilişkin bilginin derleyici opsiyonlarından encoding'in değeri olarak verilmesi ile mümkün olur.

# Seçilen kodlamaya göre UTF-8 yerine başka bir değer konulabilir.
$ javac -encoding UTF-8 TürkçeÖrnek.java

Başarı ile derlenmesinin ardından programınızın çalıştırılması için fazladan bir şey yapmanız gerekmez. Çünkü, derleme esnasında hangi karakter kodlama standardını kullanmış olursanız olun, derleyicinin üreteceği sınıf dosyalarının içindeki tanımlayıcı adları ve karakter katarı içerikleri, Java Sanal Makinesi'nin tanımında standardize edilmiş olan ve büyük ölçüde UTF-8'e benzeyen bir kodlama ile tutulur.

$ java TürkçeÖrnek "saçma sapan" bir şeyler
Komut satırından vermiş olduğunuz mesaj: saçma sapan 

Özetleyecek olursak, Türkçe içerikli bir Java kaynak dosyasının derlenip çalıştırılması aşağıda verilen şekildeki gibi sağlanabilir. Taşınabilirliğin zahmetsiz bir biçimde sağlanması ve tasarruflu disk alanı kullanımı için, derleyiciye geçirilen karakter kodlamasının UTF-8 olarak seçilmesi yerinde olacaktır; duruma göre, bu değerin UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE, UTF-32LE, iso8859-9, veya cp1254 olması mümkündür. JSM'ne ise kodlamaya ilişkin bir değerin geçirilmesi söz konusu değildir; bu değerin hem derleyici hem de JSM'nin farkında olduğu UTF-8'den çok az farklılık arz eden bir kodlama olduğu varsayılır.