Merhaba. Üzerinde uğraştığım bir Android projesinde Php kullanarak uzak sunucudaki bir mysql veritabanına kayıt atarken ve kayıt çekerken Türkçe karakterleri, soru işareti (?) ile kaydettiğini gördüm. Ayrıca sorgulama yaparken de mevcutta kayıt olduğu halde sorgu sonucunda kayıt dönmediğini ve hataya takıldığını farkettim.
Yaklaşık 2 gün boyunca araştırdım ve birçok farklı kombinasyon denememe rağmen sonuç elde edemedim. Sonunda bir blogda çözüm buldum, unutmadan not etmek ve başkalarına da yardımcı olmak için bu yazıyı yazma ihtiyacı hissettim. Her sitede farklı çözümler mevcut fakat ben ilk çözümüm bu olduğu için daha fazla kurcalamak istemedim.
Adımlar
1- İlk olarak tüm Php dosyalarımızı NotePad++ programında açıyoruz ve üst menüden Kodlama -> “BOM Olmadan UTF8 Olarak Kodla(UTF-8 Without BOM)” seçeneğini seçip dosyayı tekrar kaydederek tüm Php dosyalarını host veya sunucumuza tekrar atıyoruz. Siz tüm Php dosyaları için bunu yapmalısınız. Özellikle sorgularınızın olduğu Php dosyasında.
2 – Hangi Php dosyasında bağlantı oluşturuyorsak (ben db_connect.php dosyasında yaptım) o dosyayı açıp aşağıdaki kodu ekliyoruz ve bu dosyayı tekrar uzak sunucumuza atıyoruz.
1 |
$con->set_charset("utf8"); |
Bağlantı oluşturduğumuz satırın hemen altına ekleyelim.
3 – Tüm veritabanı, tablo ve kolonlarımızı utf8_general_ci karakter kodlamasında oluşturuyoruz. Tablomuz bu formatta oluşturulursa kolonları da bu formatta oluyor.
Eğer var olan bir veritabanınız veya tablonuz varsa bunun character encoding‘ini aşağıdaki sorguyla değiştirebilirsiniz.
1 2 |
ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_general_ci; ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; |
İster veritabanını silip tekrar oluşturun isterseniz hem veritabanı hem tablonuzu üstteki sorguyla güncelleyin. Bu işlemden sonra kolonlarınıza tek tek bakmanızı öneririm. Kolonların Enconding’inin de utf8_general_ci olduğundan emin olun. Aşağıda veritabanı, tablo ve kolon için encoding formatının son şeklini gösteriyorum.
Veritabanı encoding:
Tablo encoding:
Kolon encoding:
4 – Son olarak Android kodunuzdan, Php dosyasını çağırma işlemini POST tekniği ile yapıyorsanız “UTF-8” parametresini Android kodunuza aşağıdaki gibi ekleyiniz.
1 2 3 |
DefaultHttpClient httpClient = new DefaultHttpClient(); HttpPost httpPost = new HttpPost(url); httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8")); |
Eğer GET tekniğini kullanıyorsanız :
1 2 |
DefaultHttpClient httpClient = new DefaultHttpClient(); String paramString = URLEncodedUtils.format(params, "utf-8"); |
kodunu ekleyiniz.
Eğer Php ile değil de başka bir formatla bağlanıyorsanız 2.adımdaki gibi CHARACTER SET değeri set etmelisiniz. Php’de böyleydi, her dilde farklıdır. Eğer Android değil de başka bir platformdan bağlanıyorsanız da kodunuzun içerisinde ilgili Character Encoding belirleme kodunu kullanmalısınız. Android için bu 4.adımda yapıldı.
Yardımcı olabildiysem ne mutlu. Sorunuz olursa ya da bu şekilde sorunu düzeltirseniz yorumda belirtmenizi isterim.