OKUMA SÜRESİ 03:03

Leopard / Snow Leopard UTF8 - Türkçe sorunu bitmiiiiyoooorrr!!!

Çok basit iki Unix komutundan bahsetmek istiyorum, cat ve sort. Unix’in en büyük olayı, pipe’larla yani | işaretiyle, yapılan işlemin sonucunu, bir sonraki komuta geçirebilme özelliğidir.

Şimdi çok basit bir sıralama işlemi yapacağız, aslında Mac OS’da yapamayıp, Ubuntu’da yapacağız ne yazıkki…

Hemen bir Terminal açın ve sorter.txt adında bir boş dosya oluşturun, oluşan dosyayı nano’da açıp (ya da TextMate / TextEdit vs…) aşağıdaki metni yapıştırın:

ümit
cemal
uğur
ali
vigo
çek
ıtri
bronx
ömer
şekip

şimdi yukarıdaki işlemleri yapalım;

cd $HOME
touch sorter.txt
nano sorter.txt
TextMate ekran görüntüsü, sorter.txt dosyası

Daha sonra yukarıdaki metni copy-paste (kopyala / yapıştır) ile nano’ya yerleştirin ve kaydedip çıkın ( (kntrl) + O ve (kntrl) + X). Şimdi cat komutu ile dosyanın içeriğini ekrana basın.

cat sorter.txt
Ekran görüntüsü: Terminal’de sorter.txt çıktısı

Gördüğün gibi cat ile dosyanın içeriği ekrana basıldı. Şimdi pipe mantıkını kullanarak, satır satır ekrana yazdırdığımız bu metni, a’dan z’ye alfabetik olarak sıralayalım yani sort edelim!

cat sorter.txt | sort
Ekran görüntüsü: cat sorter.txt | sort çıktısı

Gördüğünüz gibi garip bir şekilde sıralandı:

  1. ali
  2. bronx
  3. cemal
  4. uğur
  5. vigo
  6. çek
  7. ömer
  8. ümit
  9. şekip
  10. ıtri

Eğer dikkat ettiyseniz, TÜRKÇE ile ilgili kelimeler, normal sıralamadan sonra yapılmış, yani İNGİLİZCE’ye göre a-b-c-d-e-f-g-h-i… şeklinde ali-bronx-cemal-uğur-vigo doğru sırada, fakat bronx’dan sonra gelmesi gereken çek sonda… Neden acaba? hemen locale’imize bakalım:

locale
Ekran görüntüsü: Terminal’de locale komutu çıktısı

BOOOOM! Benim locale’im komple TÜRKÇE’ye ayarlı. sort komutun man page’in bakınca der ki : (terminal’de her hangi bir komutun nasıl çalıştığını öğrenmek için man kullanabilirsiniz.)

WARNING The locale specified by the environment affects sort order. Set LC_ALL=C to get the traditional sort order that uses native byte values.

Yani sıralama işlemi, o an Terminal’de bulunan kullanıcının locale ayarıyla etkileşimlidir, yani eğer Türkçe işlem yapmak istersen locale’ini Türkçe’ye, Almanca işlem yapacaksan Almanca’ya göre ayarla…

Türkçe için külliyen YALAN! Bunu hem LEOPARD hem de SNOW LEOPARD’da da denedim… Acaba dedim sorun benim ayarlarda filanmı? hemen lokalimdeki Ubuntu’da yaptım aynı testi…

Ekran görüntüsü: Ubuntu Terminal’de locale çıktısı

Önce locale’i kontrol ettim.

Ekran görüntüsü: Ubuntu Terminal’de cat sorter.txt | sort çıktısı

Sıralama doğru!

Sonra komutu çalıştırdım. Aslanlar gibi çalıştı sıkıntısız. Ne yapmalı, derdimizi kime anlatmalı bilmiyorum? Aradaki tek fark, Mac OS’daki sort 2005 yılına ait, Ubuntu’daki ise 2008 yılına.

Belki ilk bakışta “ya bu benim ne işime yararki ?” diye düşünebilirsiniz. Bu ve buna bağlı olarak pek çok şey de aynı sıkıntı olabilir. Keza çok benzer bir sorunu tarih ile ilgili bir işlem yaparken yaşamıştım.

Umarım ben bir yerlerde hata yapmışımdır ve benim eksik bilgimden kaynaklı bir sorun söz konusudur fakat çok araştırdım, sanki sorun bende değil gibi…

Keza export LC_ALL=tr_TR.ISO8859-9 bile denedim. Belki bundandır diye. Ne yazık ki çözemedim. Eğer yazımı okuyan ve çözümü bilen biri varsa lütfen yorum bıraksın ya da bana mesaj atsın!

Özellikle TextMate kullanıcıları (filtreleme) ya da Snow Leopard kullanıcıları (servis) bu ve buna benzer shell komutlarını kullanarak hayatlarını kolay hale getirebilirler.

Ne yazıkki bu en temel Unix komutu SORT güzel türkçemizi sıralayamıyor!