Flash ve Türkçe Karakter Problemleri

01 Kasım 2008 – 23:14

Genel olarak Türkçeyi destekleyen yobazlaşmasına ve kısaltmalara karşı olan biriyim. Ama internet üzerinde programlama yaparken beni en çok sinir eden noktalardan biride Türkçe karakter sorunlarıdır. Klasik çözümler bazen yetmez, yazılan tüm kurallar ve çalışma sistemi doğrudur ama Türkçe karakterde hala sıkıntı vardır. Bu makale de Flash içerisinde karşılaştığımız genel karakter sorunlarını nasıl çözebileceğimize değineceğim. XML kullanımından, font embed etmekten, oyun sunucusu karakter problemlerine kadar birkaç farklı alandan genel sorunlarımızı nasıl çözebileceğimize değineceğim.

XML ve Türkçe Karakter Problemi

Processing Instructions Etiketi
Hemen hemen hepimiz XML ile Türkçe karakter sorunu ile karşı karşıya kalmışızdır. Genel görüş XML içerisinde yer alan ve Processing Instructions (tanımlama etiketi) eklendiği zaman çözülmesi yolundadır.

  1. <?xml version="1.0" encoding="utf-8"?>


Bu etiketin amacı uygulama için gerekli bilgileri tutmaktır. Ve genelde bu etiket tek başıma hiç bir işe yaramaz. Bu her ne kadar tam bir çözüm olmasa da kesinlikle kullanmanızı tavsiye ederim. Bu Türkçe karakterleri görüntülemek için gerekli ilk adım.

Unicode Kodu
İkinci adım ise System.useCodePage kodunun Flash dokümanı içerisinde kullanılması. Buradaki temel mantık Unicode olarak kodlanmamış karakterlerin Flash player içerisinde gözükmesi. Bu kodu Flash dokümanı içerisinde ilk satıra yerleştirmeniz yeterli olacaktır;

  1. System.useCodePage = true;

Doküman Tipi
Üçüncü adım XML dosyasının doküman tipinin ayarlanması. Bir XML dokümanının en üstteki tanımlama etiketi Utf-8 i göstermesi XML dosyasının doküman tipinin Utf-8 olduğu anlamına gelmez. Peki, bunu nasıl öğrenebiliriz? Benim tavsiyem Notepad++ adlı editörü kullanmanız. Buna benzer birçok editör var ama en hızlı ve sorunsuz çalışan bu. Notepad++ programını aşağıdaki adresten indirebilirsiniz;

http://notepad-plus.sourceforge.net/uk/site.htm

Programı indirip açtığınızı varsayıyorum, program içerisinde XML dokümanını açtığınızda programın sağ alt kısmında XML dokümanının doküman tipi yer almakta. Şu anda ANSI olarak gözüküyor. Bunun Flash tarafından doğru bir şekilde yorumlanması için yapmanız gereken buradaki doküman tipini dönüştürmek.

XML Doküman Tipi

Doküman tipini yukarıdaki menüden “Format” tuşuna basarak açılan pencereden “Encode in UTF-8” seçeneği seçiniz.

XML Doküman Tipi Değişimi

Şu anda eğer farklı bir sorun yok ise Flash içerisinde XML dokümanı sorunsuz bir şekilde çalışabilir.

Dinamik Oluşturulan XML lerde Karakter Problemi

Dinamik oluşturulan XML genelde doküman tipi belirtilmeden oluşturulur. Bu aslında en karmaşık olan sorunlardan biridir. Çünkü sistem dinamik olarak hazırlanmıştır. Ve hazırlanma kriterleri biraz ucuzdur. Burada yapmanız gereken dinamik XML i oluşturduğunuz (php,aspx, vb) dilde XML dokümanını oluşturduğunuzda doküman tipini belirtmeniz. Bu genellikle encodeType başlığı altında yer alır. Buradaki sorunu bu şekilde çözebilirsiniz.

Flash İçerisinde Kullanılan Metin Kutularındaki Karakter Problemleri
Flash içerisinde sahnede bulunan bir metin kutusuna dinamik olarak metin yazdırmaya kalktığınızda temel karakter problemi ile karşılaşabilirsiniz. Bunun çözümü ise metin kutusuna karakter embed etmekten geçiyor. Bunun için aşağıdaki yolları sırasıyla takip etmeniz gerekmektedir;

İlk olarak sahnedeki metin kutusunu seçip “Properties ” panelindeki “Embed” butonuna tıklıyorsunuz;

Flash İçerisinde Metin Kutusuna Font Embed Etmek

Daha sonra karşınıza çıkan pencerede Uppercase, Lowercase, Numerals ve Punctuation seçeneklerini seçmemiz gerekiyor. Bunu ilaveten “Include these characters” bölümünde Türkçe karakterleri yazmanız gerekmektedir.

Font Embed Penceresi

Yukarıdaki seçenekler temel ihtiyacımız olan karakter seçeekleridir. Eğer Japonca bir metin yazmak istiyorsanız yukarıdaki seçeneklerden Japoncayıda seçebilirsiniz. Dikkat etmeniz gereken diğer bir nokta ise burada en üstteki “All” seçeneğini seçmememiz. Yukarıdaki hali ile seçili karakterler 10 ile 20 KB arasında swf dosyanızın boyutunu arttıracaktır. “All” seçeneği seçildiğinde swf dosyasının boyutu baya yükselecektir.

Farklı Sunuculardaki Karakter Problemleri

Eğer yaptığınız uygulamalar için farklı sunucular kullanıyorsanız Türkçe karakter problemleriyle çok rahat bir şekilde yüzleşebilirsiniz. Buna örnek olarak Smartfox oyun sunucusunda Türkçe karakter problemi olabilir. Oyun sunucusu aynı zamanda anlık olarak bir chat uygulaması yazmanıza izin veriyor. Sorun ise tabi ki Türkçe karakterlerde. Burada benim kullandığım çözüm yolu ise karakterleri html karakterine dönüştürerek sunucu tarafına yollamak. Veri geldiğinde ise içerisinde html karakter olup olmadığını kontrol ediyorum, eğer varsa bunu Türkçe karaktere dönüştürüyorum, eğer yoksa zaten sorunda yok demektir. Bu işlemi yapan sınıf aşağıda örneğe ait sınıf yapısını ise makalenin sonunda bulabilirsiniz.

  1. package com.enginyoyen.text
  2. {
  3.      public class ReplaceLetters {
  4.         private var characters:Array =new Array("ç","Ç",
  5.                 "ş","Ş","ğ", "Ğ","ü", "Ü",
  6.                 "ö", "Ö","ı", "İ");
  7.  
  8.         private var HTMLCharacters:Array =new Array("&ccedil;","&Ccedil;",
  9.                 "&#351;","&#350;", "&#287;", "&#286;",
  10.                 "&uuml;", "&Uuml;","&ouml;", "&Ouml;",
  11.                 "&#305;","&#304;");
  12.  
  13.         var myPattern:RegExp;
  14.         var tempA:String;
  15.         var tempB:String;
  16.  
  17.         var changeString:Boolean = true;
  18.         public function printHtml(msg:String):String{
  19.                 tempA = msg;
  20.                 for(var i:uint =0; i<characters.length; i++){
  21.                         myPattern = new RegExp(characters[i], "g");
  22.                         if(changeString){
  23.                                 tempB = tempA.replace(myPattern, HTMLCharacters[i]);
  24.                                 changeString =false;
  25.                         }else{
  26.                                 tempA = tempB.replace(myPattern, HTMLCharacters[i]);
  27.                                 changeString =true;
  28.                         }
  29.                 }
  30.                 if(changeString){
  31.                         return tempA;
  32.                 }else{
  33.                         return tempB;
  34.                 }              
  35.         }
  36.                
  37.         public function printNormal(msg:String):String{
  38.                 tempA = msg;
  39.                 for(var i:uint =0; i<characters.length; i++){
  40.                         myPattern = new RegExp(HTMLCharacters[i], "g");
  41.                         if(changeString){
  42.                                 tempB = tempA.replace(myPattern, characters[i]);
  43.                                 changeString =false;
  44.                         }else{
  45.                                 tempA = tempB.replace(myPattern, characters[i]);
  46.                                 changeString =true;
  47.                         }
  48.                 }
  49.                 if(changeString){
  50.                         return tempA;
  51.                 }else{
  52.                         return tempB;
  53.                 }       
  54.         }
  55.     }
  56. }

Flash içerisinde kullanılacak olan kod ise şu şekilde;

  1. import com.enginyoyen.text.*;
  2.  
  3. var replaceLet:ReplaceLetters = new ReplaceLetters();
  4. var testMetni:String = "Türkçe çok kolay bir dil değil…";
  5.  
  6. testMetni = replaceLet.printHtml(testMetni);
  7. trace(testMetni);
  8. //T&uuml;rk&ccedil;e &ccedil;ok kolay bir dil de&#287;il…
  9.  
  10.  
  11. testMetni = replaceLet.printNormal(testMetni);
  12. trace(testMetni);
  13. //Türkçe çok kolay bir dil değil…

Son Çözüm

Her ne kadar yukarıda yazılanlar birer çözümde olsa bazen çözümleri bilmek demek sorunun ortadan kalkması demek olmuyor maalesef. Diyelim ki bir firmanın web sitesi üzerinde değişiklik yapıyorsunuz ve yüzlerce hazır XML dosyasından bilgi çekmeniz gerekiyor. Ve XML dokümanlarının tamamı ANSI olarak kodlanmış ve Flash içerisinde sorun çıkıyor. Bu durumda yapılacak bir tek şey bu karakterleri belirleyip Türkçe karakterler ile değiştirmek. Bunun için aşağıdaki gibi basit bir işlem sorunlarınızı çözecektir;

  1. function checkCharacter(str:String):String {
  2.         str = changeCharacter(str, "Ä?", "ğ");
  3.         str = changeCharacter(str, "ı", "ı");
  4.         str = changeCharacter(str, "ö", "ö");
  5.         str = changeCharacter(str, "ç", "ç");
  6.         str = changeCharacter(str, "ÄŸ", "ğ");
  7.         str = changeCharacter(str, "ÅŸ", "ş");
  8.         str = changeCharacter(str, "ü", "ü");
  9.         str = changeCharacter(str, "Ö", "Ö");
  10.         str = changeCharacter(str, "Ş", "Ş");
  11.         str = changeCharacter(str, "İ", "İ");
  12.         str = changeCharacter(str, "Ç", "Ç");
  13.         str = changeCharacter(str, "Ü", "Ü");
  14.         str = changeCharacter(str, "Ğ", "Ğ");
  15.         str = changeCharacter(str, "ð", "ğ");
  16.         return str;
  17. }
  18. var tempArray:Array = new Array();
  19. function changeCharacter(str:String, brokenStr:String, turkishStr:String):String {
  20.         tempArray = str.split(brokenStr);
  21.     str = tempArray.join(turkishStr);
  22.     return (str);
  23. }
  24.  
  25. trace(checkCharacter("Türkçe karekter çözümü"));
  26. //Türkçe karekter çözümü

Kaynak Kodlar
http://enginyoyen.com/blog/tr/wp-content/uploads/2008/11/turkce_karakter_sorunu.rar
Sorunsuz kodlamalar
Kolay Gelsin
Engin Yöyen

Bu makale ile ilgili olabilecek yazılar


  1. 6 Responses to “Flash ve Türkçe Karakter Problemleri”

  2. çok ihtiyaç duyulan bir makale..
    genelde herkez dreamviewer kullanır ve default karakterler ansi dir.. Ayarlardan Font ve yeni belge kısmında türkçeyi seçtiğimizde sorun kalmıyor.. Yanlız bir sorun daha var başka biryerden alınan xml ler de genelde ansi kodlamayla geldiklerinden bunları tekrar düzeltmek gerekebiliyor..
    sonuç olarak en mantıklısı senin dediğin gibi notepad…
    Sadece değinmek niyetiyle kolay gelsin..

    By emrahatilkan on Kas 4, 2008

  3. bir ricam var..
    swfaddress javascript-actionscript kodcuğunun kullanımı hakkında bir makale yazarsan çok sevinirim.. Birde bunun arama motorları açısından ne işe yaradığınada değinirsen süper olur…
    kolay gelsin..

    By emrah atılkan on Kas 5, 2008

  4. Merhaba Emrah,
    bahsettiğin swfaddress deeplink için değil mi?

    By Engin Yöyen on Kas 5, 2008

  5. evet tamamen..

    By emrahatilkan on Kas 5, 2008

  6. hocam, pixel font embed yaparken, uppercase ve lovercase karakterleri dahil etsek bile, pixel fontların çoğunda bu karakterler olmadığı için, yine default font olarak görünüyor. flash bu text areaları system fontundan seçiyor.

    ayrıca pixel fontu türkçeleştirince de aynı problem oluyor. yani bütün; embed, utf-8, codepage.true, fontu türkçe yapmak …v.s. işlemlerin tümü, pixel fontlar için geçerli olmuyor.

    By cem on Ara 8, 2008

  7. Merhaba Cem,
    buradaki sorun fontan kaynaklanıyor bence. yani içerisinde türkçe karakter olmayan bir fontun türkçe karakter göstermesini bekleyemezsin.
    Bunun için şu şekilde bir yöntem izleyebilirsin. Bu fontları flash içerisinde statik bir metin kutusuna türkçe karakterler yazarak test edebilirsin. Eğer türkçe karakterleri orada görebiliyorsun, embed ettiğinmdede gözükecektir.

    By Engin Yöyen on Ara 9, 2008

Yorum Ekleyin