Flash ve Türkçe Karakter Problemleri
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.
-
<?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;
-
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.

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

Ş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;

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.

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.
-
package com.enginyoyen.text
-
{
-
public class ReplaceLetters {
-
private var characters:Array =new Array("ç","Ç",
-
"ş","Ş","ğ", "Ğ","ü", "Ü",
-
"ö", "Ö","ı", "İ");
-
-
private var HTMLCharacters:Array =new Array("ç","Ç",
-
"ş","Ş", "ğ", "Ğ",
-
"ü", "Ü","ö", "Ö",
-
"ı","İ");
-
-
var myPattern:RegExp;
-
var tempA:String;
-
var tempB:String;
-
-
var changeString:Boolean = true;
-
public function printHtml(msg:String):String{
-
tempA = msg;
-
for(var i:uint =0; i<characters.length; i++){
-
myPattern = new RegExp(characters[i], "g");
-
if(changeString){
-
tempB = tempA.replace(myPattern, HTMLCharacters[i]);
-
changeString =false;
-
}else{
-
tempA = tempB.replace(myPattern, HTMLCharacters[i]);
-
changeString =true;
-
}
-
}
-
if(changeString){
-
return tempA;
-
}else{
-
return tempB;
-
}
-
}
-
-
public function printNormal(msg:String):String{
-
tempA = msg;
-
for(var i:uint =0; i<characters.length; i++){
-
myPattern = new RegExp(HTMLCharacters[i], "g");
-
if(changeString){
-
tempB = tempA.replace(myPattern, characters[i]);
-
changeString =false;
-
}else{
-
tempA = tempB.replace(myPattern, characters[i]);
-
changeString =true;
-
}
-
}
-
if(changeString){
-
return tempA;
-
}else{
-
return tempB;
-
}
-
}
-
}
-
}
Flash içerisinde kullanılacak olan kod ise şu şekilde;
-
import com.enginyoyen.text.*;
-
-
var replaceLet:ReplaceLetters = new ReplaceLetters();
-
var testMetni:String = "Türkçe çok kolay bir dil değil…";
-
-
testMetni = replaceLet.printHtml(testMetni);
-
trace(testMetni);
-
//Türkçe çok kolay bir dil değil…
-
-
-
testMetni = replaceLet.printNormal(testMetni);
-
trace(testMetni);
-
//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;
-
function checkCharacter(str:String):String {
-
str = changeCharacter(str, "Ä?", "ğ");
-
str = changeCharacter(str, "ı", "ı");
-
str = changeCharacter(str, "ö", "ö");
-
str = changeCharacter(str, "ç", "ç");
-
str = changeCharacter(str, "ÄŸ", "ğ");
-
str = changeCharacter(str, "ÅŸ", "ş");
-
str = changeCharacter(str, "ü", "ü");
-
str = changeCharacter(str, "Ö", "Ö");
-
str = changeCharacter(str, "Å", "Ş");
-
str = changeCharacter(str, "İ", "İ");
-
str = changeCharacter(str, "Ç", "Ç");
-
str = changeCharacter(str, "Ü", "Ü");
-
str = changeCharacter(str, "Ä", "Ğ");
-
str = changeCharacter(str, "ð", "ğ");
-
return str;
-
}
-
var tempArray:Array = new Array();
-
function changeCharacter(str:String, brokenStr:String, turkishStr:String):String {
-
tempArray = str.split(brokenStr);
-
str = tempArray.join(turkishStr);
-
return (str);
-
}
-
-
trace(checkCharacter("Türkçe karekter çözümü"));
-
//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
32 Responses to “Flash ve Türkçe Karakter Problemleri”
Leave a Reply


ç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..
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..
Merhaba Emrah,
bahsettiğin swfaddress deeplink için değil mi?
evet tamamen..
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.
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.
Merhaba;
Bu çözümler gerçekten açıklayıcı olmuş.Zaten birçoğumuz artık bildiği konular fakat bir arada olması gerçekten iyi olmuş.Ancak burdaki Dynamic XML’de replace yöntemi soruna kesin çözüm gibi gözükmüyor. Türkçe karakterlerde bu bir çözüm ancak Rusça, Arapça gibi dillerde neredeyse tüm harfleri özel bir karaktermiş gibi nitelendiriyoruz. Kiril Lafabesindeki tüm harfleri Replace etmek hem performans açısından, hem de yazımdaki mantık açısından bana doğru bir işlemmiş gibi gözükmüyor.
Hocam Merhaba,
Flash ile hazırladıgımız ve php kullanarak
yolladıgımız iletisim formumuzda
embeded yaptık karekterleri degistirdik utf 8 ne yaptıksa sorun cozulmedi
halen “ç” “ş” “ı” gibi harfler garip karekterl olarak gözükmekte.
bunun çaresini bulan bi arkadas yazsın lutfen
Merhaba Burak,
sorun php tarafında diye düşünüyorum. Php kodunu ekleyebilirsin hatayı çözmene yardımcı olabilirim.
benim sıkıntım class içerisinden yarattığım dinamik textlerde türkçe karakterlerin embed edilmesi üzerine.Flash dosyalarımda hiçbir eleman bulunmuyor. Bütün site elemanları class lar tarafından yaratılıyor. Bildiğiniz gibi fontu tanıtmak için library de class da kullanacağımız fontu oluşturup classın okuyabilmesi için link veriyoruz. Class içerisinden var myFont:Font = new fontFromLib(); gibi bir kod parçasıyla tanıtıyoruz. Burada türkçe karakterlerin embed i nasıl yapılıyor?
Merhabalar Engin bey, actin script ile label islevini kullanmak istiyorum fakat labellerin isimlerini yazdıgım zaman türkce karekterler görünmüyor. paylastıgınız yöntemleri denedim ama ya ben beceremedim yada dogrusunu denemedim. sadece flash icerisinde ki action bölümünde labellere verdidim isimlerin türkce olmasını istiyorum bunu nasıl yapabilirim? simdiden tesekkurler iyi calismalar dilerim.
Merhaba Emrah,
class içeriisnde yarattığın kodda bir sorun çıkmaması gerekiyor. Aşağıda sınıf yapısı ile basit bir kod var. Kod içerisinde ki metin kutusu türkçe karakter barındırıyor ve herhangi bir sorun yok;
package {
import flash.display.Sprite;
import flash.text.TextField;
public class TextFieldFile extends Sprite {
public function TextFieldFile() {
var tF:TextField = new TextField();
tF.text = “Türkçe karakterler : ıİüğş”;
tF.width = 400;
addChild(tF);
}
}
}
Fontu nasıl embed edeceğine gelirsek, fontuna aynı şekilde sınıf yapısı ile embed edebilirsin. Ama bunun içinde boş bir flash dosyasının içerisine eklemen gerekiyor. Fontu seçerkende dikkat etmen gereken fontun içerisinde türkçe karakterlerin olmasıdır.
Eğer fontun karakter desteği yoksa zaten herhangi bir işlem yapamazsın.
Merhaba Mehmet,
labellarda da bir sorun çıkmaması gerekiyor. Kodun kullanımı şu şekilde;
label_com.text= “Türkçe karakterler : ıİüğş”;
kodu tekrar dene istersen, dikkat etmen gereken nokta ise eğer componentin kullandığı stili değiştirip, değiştirdiğin stildeki font türkçe karakteri desteklemiyorsa bu işlemi yapamazsın. Font seçiminde türkçe karakterleri destekleyen fontları seçmeni tavsiye ederim.
kolay gelsin
Teşekkürler Engin bey.
Merhaba Engin,
Sınıf içerisinden flash kütüphanesine ( örnek olarak LibFont diyelim) eklediğim bir fontu var myFont:Font = new LibFont() şeklinde eklediğim zaman embedFonts=true fonksiyonu sonucunda türkçe karakterler ortadan kayboluyor. Türkçe karakterleri embed etme dediğim zaman sorun ortadan kalkıyor ancak o zaman kullandığım font tipleri eğer sistem fontu değilse başka makinelerde görünemiyor. Buna çözüm olarak new LibFont() demek yerine sahne dışına yeni bir dinamik textField ekleyip textField de embed işlemini yaptıkdan sonra, class içerisinde font olarak değil direk font ismiyle çağırdığım zaman ( örn “Helvetica” ) türkçe karakter sıkıntısı yaşamıyorum. Benim sorum ilk yöntemde embed işleminde neden türkçe karakterler görünmüyor ? Buna bir çözüm var mıdır?
Teşekkürler üstad. Flash ile hiç alakam olmamasına rağmen başıma böyle bir durum geldi ve düzeltmem gerekiyordu. Verdiğin çözümlerden sonuncusunu actionscript kodları içerisine ekledim, değişmesi gereken kısımları fonksiyon ile çağırdım ve sorun çözüldü. Tekrar teşekkürler.
Merhaba,
mdb dosyasından asp ile flasha veri çekilerek çalışan bir fla dosyası ile uğraşıyorum ve Türkçe karakterler görünmüyor. Verdiğiniz yöntemleri denedim ama bir türlü düzeltemedim. mesela son çözüm olarak verdiğiniz kodları ekledim ama hata verdi. Acaba kodlar mc ye yazıldığı için olabilir mi? Yardım edebilir misiniz?
Hocam uzun zamandan beri uğraşıyordum.. Embed olayı çözdü.. sayenizde.. çok teşekkür ederim..
iyi çalışmalar hocam… Hazır bi temp. dosyasını düzenliyorum flash ve xml den oluşan sistemde bulunan yada sonradan yüklediğim fontların hiç birinde türkçe karakterleri ekrana yansıtamıyorum yanı bozuk çıkmıyo ama ‘Ş’ = ‘S’ ‘ü’='u’ şeklinde otomatik mi tnımlıyo anlamadım yukarıdaki yazınız ve netteki bir iki dökümanı okudum elimden geldiğince yaptım ama olmadı. Actionscript in içindeki kodlarıda (anladığım kadar) inceledim bu şekilde bir eşleme yapamasını sağlayan bir kod da görmedim
iki gündür baş ağrısı oldu yazdıklarının dışında neden olabilir acaba?
Merhaba,
yüklediğin fontlar türkçe karakteri destekliyormu peki? önce onu bir öğren bence.
Kolay gelsin
Merhaba,
Kısa bir soru sormak istiyorum, bu yazdıklarınız MAC bilgisayarlardaki dinamik xml den gelen türkçe karakter problemine çözüm oluyormu. Bir site yaptım produsiyon sitesi pclerde türkçe karakterler sorunsuz görünüyo ama MAC bilgisayarlarda sorunlu.
Merhaba Ali,
temelde bir sorun çıkmaması gerekiyor ama eğer sorun varsa Mac’in dil ayarlarında da olabilir.
Kontrol edip birde öyle dene istersen. Ama açıkçası ben Mac kullanıcısı değilim. Sadece test için kullanıyorum o yüzden pek bir şey de ekleyemeyeceğim.
Merhaba Engin bey,
Aslında bende Mac kullanmıyorum, ama müşterim kullanıyor o nedenle bende test edemiyorum ayarları değiştiremiyorum.
İlginiz için teşekkürler.
Merhaba Ali,
AIR kitabını hazırlarken kodları test etmek için mac ve linux işletim sistemleri gerekiyordu. Bende bunun için Virtual machine diye bir emülator kullandım. Önce programı yüklüyorsun daha sonra da mac, linux veya herhangi bir işletim sistemini vista veya xp üzerine kurabiliyorsun.
Aşağıdaki linkten gerekli bilgiyi alabilirsin;
http://www.vmware.com/
Kolay gelsin
merhabalar
benim şöyle bi sorunum var
elimde bi template var ve ana sayfaya dışardan swf ler çağırıyor. dışardan çağırdığı swflerede xmlden içerik gelior..
sorunsa şu dışardan çağırılan swfler tek çalştrldığı zaman karakter sorunu olmuo onu embed le çözdüm fakat. ana swf çalştrlp içine çağrıldığı zaman karakter sorunu oluo..
bunu nasıl çözebilirim yardımcı olur musunuz.
dışardan alan kodlar bunlar yazmayı unuttum özür dilerim
function loadMovieClip (externalTarget:String, targetRoot:MovieClip) {
var mcLoader:MovieClipLoader = new MovieClipLoader ();
var listenerLoad:Object = new Object ();
listenerLoad.onLoadStart = function (target:MovieClip) {
loader._visible = true;
ZigoEngine.doTween (loader,’_alpha’,100,0.5,”easeOutExpo”);
};
soruma cevap gelmedi ama çözdüm yiende yardımınz oldu okudklarımdan allah razı olsun.. bi sorum daha war ama :S
Merhaba,
sorununu çözdüğüne sevindim. Diğer sorunu sorabilirsin tabiki.
Merhaba Engin Hocam,
Bende kendim oluşturduğum bir yöntemimi paylaşmak istiyorum sizin yaptığınız çalışmalardan biraz daha kısa ve package ile uğraşmak istemeyen arkadaşlar için…
var my_str:String =”& ' "”;
function htmlspecialchars(str:String) {
str = str.split(”&”).join(”&”);
str = str.split(”'”).join(”‘”);
str = str.split(”"”).join(”\”");
str = str.split(”<”).join(”");
str = str.split(”’”).join(”’”);
str = str.split(”Y”).join(”İ”);
str = str.split(”y”).join(”ı”);
str = str.split(”?”).join(”ğ”);
str = str.split(”?”).join(”ş”);
str = str.split(”\n”).join(”");
return str;
}
trace(htmlspecialchars(my_str));
kolay gelsin…
link çalışmıyor kontrol eder misiniz?
@ahmet,
link çalışıyor ahmet, tekrar dene istersen.
Merhaba;
dediğiniz yönetemleri denedim fakat bir türlü donuca ulaşamadım. dinamik bir xml dosyası kullanıyorum. Hata XML bile değil asp dosyası. Response.ContentType=”application/xml” ile bunu XML olarak tanıtıyorum bilgileri db’den çekiyor. BUraya kadar herşey normal. XML dosyasına da bakıyorum orada da karakterler normal fakat bunu Flash’ın içinde göremeyirom. Flash dosyayı açtığı zaman rusça ve türkçe karakterler yerine ilginç karakterler çıkıyor. Sorun ne olabilir acaba?