
Hala UNICODE‘la sorun yaşanlarlar için referans olabilecek bir yazı yazmaya karar verdim. Her ne kadar ana uğraşımız bir LAMP ortamını (Apache + {PHP, Perl} + MySQL) UNICODE’la barışık hale getirmek olsa da, buradaki ana başlıkları diğer ortamlara da kolayca uyarlayabileceğinizi unutmayın.
1. Sisteminizi tanıyın…
Bu kural tüm adımların altın kuralıdır. Uğraştığınız sistemdeki arayüzleri bilmeden, ne nerden gelip nereye nasıl gidiyoru bilmeden yapacağınız tüm değişikler kuralsızca ve sadece sezgisel olacaktır.
Öncelikle ne ile uğraştığınızı anlayın. Bu arayış içerisinde şu aşağıdaki alanların hangisinde bilgi saklayıp, bilgi transferi yaptığınızı not edin:
- Kullanılan dosyalar (veri veya kodların bulunduğu dosyalar olabilir)
- Veritabanı (tablolardaki özelliklerin türleri)
- Kullanılan programlama dili (dilin stringleri hangi türde encode ettiği)
- Veri yolları ve veritabanı bağlantısı
- Çıktınızın başlıklıkları ile belirttiğiniz karakter seti türü
Biraz karmaşık gibi gelebilir ama gerçek bir çözüm için uyanık olup, her alanı gözden geçirdiğinizden emin olmanız ön koşuldur.
Sistemi tanıdıktan sonra, belirlenen tüm parçaları UNICODE ile nasıl uyumlu hale getireceğimiz konusuna başlayabiliriz. Ben örnek olarak bir LAMP paketini nasıl tamamen UTF-8′le sorunsuz çalıştıracağız onu inceleyeceğim.
2. UTF-8 ile çalışacağınızı ortamınıza anlatın
Bu noktadan sonra yapacağımız her adım yukarıda belirtilen parçaları UTF-8 ile uyumlu hale getirmek için sarfedilen çaba olacaktır.
2.1 Dosyalar
Kullanılan tüm dosyaların (örn. PHP dosyaları, JS dosyaları, veri için kullanılan XML dosyaları) kodlaması UTF-8 yapılmalıdır. Herhangi bir editörde dosyanın özelliklerini görüntülediğinizde bu alanda hangi tipte kodlanması gerektiğini seçebileceğiniz bir menü gelir. Menüden UTF-8′i seçmelisiniz. Sistem içerisinde kullanılan tüm dosyalara bu işlemi uyguladıktan sonra bir sonraki adıma geçmeyi hakkettiniz demektir.
2.2 Veritabanı
Tüm tablolarınızın string için ayrılan özelliklerin collation’ını “utf8_unicode_ci”, “utf8_unicode_bin”, vb. şekilde olacak şekilde ayarlayın. NOT: Bu adımda başınız biraz ağrıyabilir.
2.3 Kullanılan Programlama Dili
Her programlama dilinin içsel olarak string’leri kodlamaya yarayan bir varsayılan bir karakter seti vardır ve genelde bu UTF-8 değildir. İçsel kodlamayı UNICODE karakter setlerinden biriyle yapmak istediğinizde varsayılanı manuel olarak değiştirmeniz gerekir. Örneğin PHP’de bir değişim yapmak için php.ini, httpd.conf veya .htaccess içerisine şunları ekleyebilirsiniz:
mbstring.language = Neutral mbstring.internal_encoding = UTF-8 mbstring.encoding_translation = On mbstring.http_input = auto mbstring.http_output = UTF-8 mbstring.detect_order = auto mbstring.substitute_character = none default_charset = UTF-8
Unutmayın mbstring eklentisi kurulu değilse, PHP’ye bunu eklemeniz gerekiyor.
mbstring bu şekilde ayarladıktan sonra artık bildiğimiz temel string fonksiyonlarının yerine mbstring fonksiyonlarını kullanmamız gerekecektir. Örneğin sptlit() fonksiyonu yerine mb_split() kullanılmalıdır.
2. 4 Veritabanı bağlantısı
Veritabanı ile ilgili düzenlemeler iki bölümden oluşur. İlki 2.2′de yapılan karşılaştırma kodlamasının değiştirimi, ikinci ise veri alıp verirken verinin hangi türde kodlanıp iletileceği ile ilgilidir. Veritabanın varsayılan karakter setini kullanmasını istemiyorsak her veri alışverişinde şu sorguyu çalıştırmamız gerekir:
$db->run("SET CHARACTER SET 'utf8' ");
Unutmayın, MySQL UTF-8 için, standart olmayan utf8 kısaltmasını kullanır.
2.5 Çıktı Başlıkları
Sayfalarınızın ya da XML vs. gibi veri ilettiğiniz çıktıların başlıklarına dökümanın UTF-8 ile kodlanması gerektiğini anlatan başlıkları eklemeyi unutmayın. Apache’nin konfigürasyonundan bir varsayılan karakter seti tanımlayabileceğiniz gibi HTML/XHTML için başlık etiketlerini de kullanabilirsiniz.
<meta http-equiv="Content-type" value="text/html; charset=UTF-8" />
Elbette durumdan duruma müdahale edilmesi gereken yerler artabilir/azalabilir. Önemli olan ilk altın kuralı uygulayıp neyin nereden nasıl geldiğini ve neyin nereye nasıl gittiğini bulmaktır. Gerisi için zaten yeterince konfigürasyon dökümanı bulunmakta ![]()
Kategori?



Made on a
Teşekkürler, ilk adım oldukça işime yaradı. Gene tüm zamanlara hitap eden bir yazı olmuş.
Keşke şu karakter setleri oluşturulurken, taa en başından unicode olarak düzenleselermiş. O zaman bu sorun taaa en başından çözülmüş olacaktı :'( .
@Ali,
Ama örneğin ASCII ile 5 karakter 5 baytla kodlanabilir. UTF-8de ise her karakter başına 2 bayt harcıyoruz. Yani herşey UTF-8 ile kodlansaydı hem ağ trafiğini hem de harddiskleri gereksiz yere 2 kat daha fazla kullanan milyarlarca ortam olacaktı.
UTF-16 ile yeni bir yaklaşım geliyor ve her karakter farklı uzunluktaki bit serisiyle ifade edilebiliyor. Ama UTF-16 ve UTF-32 ASCII ile uyumlu değil
Neyse ki Java ve .NET internal coding'de default olarak UTF-8 kullanıyor.
Yahoo mailin hala bu standartı desteklememesi çok garip. Yıllarca yahoo mail kullanmış biriyken, geçen sene karakter eşleşmelerine ayırdıkları önemin eksikliğinden dolayı Yahoo Mail'i bıraktım.
bir zamanlar kaç kere baştan veri tabanı tabloları oluştururdum karakter setleri yüzünden. alllahtan sonra sonra öğrendim de utf-8 yapmam gerektiğinide büyük yükler kalktı sırtımdan.
Konu ile alakasız gelebilir ama UTF-16da değişken bir kodlama tekniği kullanıldığında mı Japonca ya da Çince karakterler dışında sadece 2 bytelık alan kullanılıyor?
Makale icin tesekkurler...
Tum bunlara ek olarak "hersey unicode ama bu mysql niye hala sorunlu calisiyor" dediginiz durumlarda
""" show variables like "char%"; """ sorgusunun ciktisina goz atmak faydali olacaktir.
Bu arada uzunca bir suredir mb_string'in ve turkce karakterlerin case dosunumlerinde bir bug'a sahip oldugunu ve bunun ancak php 6 da duzeltilecegini hatirlatmak isterim.
@Özlem, evet değişkenden kasıt tamamen farklı karakterleri farklı sayılardaki bit yığınıyla ifade etmek anlamında. Sadece Çince, Japoca karakterler için mi 4byte kullanıyor bilemiyorum ama örneğin Türk alfabesindeki ek karakterleri kodlamak için 2 byte kullanıyor.
Çok güzel ve açıklayıcı anlatmışsın sağol Burcu.
Bunu silersin burcu@burcudogan.com mail attım geri geldi de cevaben yazdım dı.
Canım valla Ömi Ömer yani eşim samsungda web siteleri ve online paza müdürü
onun yazılarına yorum gelince bir seviniyor sorma
Çok teşekkür ederim bir üründe sorun olursa yada ne ürün olursa olsun almak istersen indirim yaparız şekerim
Çok öperim
sevgiler
Burcu
http://www.burcudogan.com | burcu@burcudogan.com | 88.226.10.35
Samsung’u seviyorum, uzun zamandır cep telefonunda tercihim samsung oldu ve hiç hayal kırıklığına uğramadım. Samsung F250 ile bayanlar için özel cep telefonu yapmayı iyice benimsemiş sanırım. En feminist elektronik şirketi olma yönünde ilerliyor.
From Samsung’dan Müzik Telefonu, 2008/04/14 at 4:44 PM
mbstring'e çok güvenmeyen birisiyim fakat güzel bir yazı olmuş...
S.a Oncelikle Uyarmak istedim.. Ama Nasil iletisime gecicegimi Bulmadim
burdan soyluyeyim dedim.. Siteniz wordpress 2.5 surumunu kullaniyor... ve son gunlerde wordpress 2.5 de bir suru acik cikmistir... blogunuzu kayb etmek istemiyormusaniz bi dusuk surume gecin bence
Aciklar:
1. secret_key vuln.
http://blogsecurity.net/wordpress/wordpress-25-secret_key-vulnerability/
2. Wp-login.php SQL injection
http://blogsecurity.net/wordpress/wordpress-25-admin-login-sql-injection-rumour/
3. wp-comments-post.php
http://www.securityfocus.com/bid/28703/info
Harbiden de bu dildeki en tehlikeli blog. Yazını görünce NetBeans'taki bir projenin kaynak kodunun dil kodlamasını kurcalayayım dedim (Bakalım değiştirince ne olacak.).
Sonuç koddaki bütün Türkçe karakterler sanki dil Japonca oldu.
Neyseki böyle olacağını tahmin ettiğim için sağlam bir yedeğini almıştım. Almasaydım yedeği şimdi binlerce satırdaki Türkçe karakterleri değiştir dur. 
@The Shadow,
Evet apar topar 2.5.1 çıkarıldı. Sanırım 80 yakınında tespit edilmiş ciddi sorun vardı. 2.5.1'e güven olur mu, bilinmez... O nedenle hergün düzenli yedekleme yapmak gibisi yok
2.5 çıktığı gibi herkes bu sürüme geçmeye acele etti ama tarih tekerrürden ibarettir denirya, tarih yine bizi yanıltmadı. Her yeni temel sürümlerdeki gibi bunda da beklenmeyen birçok açık çıktı. Daha sonra da 2.6 çıkacak, onda da birçok açık olacak 2.6.1, 2.6.2 ... Bir açık kapanıyorsa diğeri açılıyor, bu sürüm güncelleme işlemlerinde o kadar acele etmemek gerek.
@Burcu,
2.5.1 surumunde de tam olarak hepsi kapatilmadi.. 2.3.3 e gecmek en iyisi bence
slm arkadaşlar konu dışı ama söyliyim : )
yaklaşık 4 gün önce buldum bu blogu gerçekden burcu çok iyi ve bilgili aynı zamanda paylaşımcı ... fakat bedemi bi gudubetlik :d var anlamadım kimin bloguna baksam böyle kaybolub gidiyo önceden hergün güncelleyen ben baktıktan sonra 1 haftada bir güncelliyo bundan sonra kimsenin bloguna bakmıycam : )
Değerli Burcu hanım.
Blogunuzu ilgiyle takip etmekte ve verdiğiniz kaynaklardan ziyadesi ile yararlanmaktayız. Öncelikle bu hususta sizleri tebrik ve teşekkür etmek isteriz. Bizde kendi çapımızda yeni bir blog oluşumuna girmiş durumdayız ve takdir edersinizki enbüyük sıkıntımız kendimizi tanıtmak. Eğer sizin için bir mahsuru yoksa blogunuz ile link değiştirmek isteriz. Müsbet menfii cevabınız ne olursa olsun şimdiden vakit ayırdığınız için teşekkür eder iyi çalışmalar dileriz.. Saygılarımızla YazBuraya.com ekibi
NOT: mail adresinizi bulamadığımız için yorumlar kısmından size ulaştık. bunun için özür dileriz.
Teşekkürler Burcu Doğan, çok güzel yazıyorsunuz.
Keyifle okudum.
Elinize sağlık.
Saygılar...
Burcu Selam,
İletişim formunu kaldırdığın gibi maşallah e-posta adresini de ortalıktan kaldırmışsın
Bu yüzden ben de böyle bir yol uygulayayım dedim. Mümkünse benimle iletişime geçebilir misin ? Seninle bir şey konuşmak istiyorum..
Görüşmek üzere..
Benim karsilastigim bir cok programci response header'ina utf8 girmedigi icin bu sorunla karsilasiyor: $self->header_add(-charset=>"utf-8");
Bir de bazi editorler default olarak utf8 ile acmiyor dosyalari. Ilk is hemen ona bakmak gerek.
Bu link cok ogretici olacak tesekkurler
Teşekkürler.
http://www.sibelkaleoglu.com seo yapmaya calıstım biraz (: olmuşmu arkadaşlar
Evet, Bertan olmuş hem de biraz Black Hat SEO dediğimizden olmuş.
Yazınız için ellerinize sağlık. çok güzel bir yazı olmuş.
Tebrikler
Aslına bakarsan. utf-8 Büttün dünya dili. ee büyük bir web site yapma peşindeysen bütün dunya görsün isteriz elbet...
utf-8 de benım basıma sole bı olay gelmiştir.
notepad ile calısıyordum dosyaları kaydedip sorguladıgımda ş ler yy olarak cıkıyordu.. sorunu cözdüm.
belki bilmek isteyenler olur. notepad da dosya > farklı Kaydet dedikten sonra kodlama kısmını utf-8 olarak seçin.