PDA

Tam Sürümünü Görmek İçin : C++ Türkçe Karakter


utdemir
08/03/2008, 19:22
Daha önce binlerce kez sorulmuş olan soruyu tekrar soruyorum. MS-DOS konsolunda türkçe karakter görüntülemek imkansız mıdır? Kendi projemde, locale.h isteyen çozümü denedim ve hiç bir şey değişmedi. Varsa eğer yolu yordamı nedir bu işin?


nibble
09/03/2008, 07:57
aslında aynı konuyu bende araştırıyorum. c ye yeni başladım çok profesyonel bi çözüm değil ama şu şekilde Türkçe karakterleri dos ekranına aktarabiliyorum.

#include <stdio.h>

void main(void)
{
char isim[]={"IiĞğÇçÜüŞşÖö"};
int i;

for (i=0;i<strlen(isim);++i)
{
isim[i]=(isim[i]==-2) ? 159:isim[i]; //ş
isim[i]=(isim[i]==-3) ? 141:isim[i]; //ı
isim[i]=(isim[i]==-4) ? 129:isim[i]; //ü
isim[i]=(isim[i]==-10) ? 148:isim[i]; //ö
isim[i]=(isim[i]==-16) ? 167:isim[i]; //ğ
isim[i]=(isim[i]==-25) ? 135:isim[i]; //ç
isim[i]=(isim[i]==-34) ? 158:isim[i]; //Ş
isim[i]=(isim[i]==-35) ? 152:isim[i]; //İ
isim[i]=(isim[i]==-36) ? 154:isim[i]; //Ü
isim[i]=(isim[i]==-42) ? 153:isim[i]; //Ö
isim[i]=(isim[i]==-48) ? 166:isim[i]; //Ğ
isim[i]=(isim[i]==-57) ? 128:isim[i]; //Ç
printf("%c",isim[i]);
}

}

fakat ustaların bu konuda daha iyi bi çözümü varsa bende öğrenmek istiyorum.

uszr
09/03/2008, 13:45
Normal olarak setlocale'in bunu saglamasi gerekiyor.Sizin dos codepage degismis olabilir.(dosta chcp komutu ile bakabilirsiniz)

Bunun disinda daha compatible olabilmesi icin tchar.h yi kullanabilirsiniz.(tabi beraberinde getirdigi makrolar ve output fonksiyonlari ile birlikte)

golgepapaz
09/03/2008, 18:56
Derleyiciden derleyeciye degismekle beraber (ben VC8.0 kullaniyorum)
Bunu yapmanin standart yolu.

#include <iostream>
#include <string>
#include <locale>
using namespace std;

int main()
{
// locale::global(locale("Turkish"));
wcout.imbue(locale("Turkish"));
wstring hola=L"AaŞşÖöİıĞğÇçÖö";
wcout<<hola;
}

yukaridaki gibi olmali, ama bu calismiyor, eger commentledigim satiri acarsan programin global localini degisitiricesginden(bu sanirim c deki setlocale'i kullaniyor) istedigin sonucu elde ediyorsun.
tabii bunun icin kullandigin konsol ekraninin codepage ini uszr'nin dedigi gibi turkce set etmen gerekiyor(chcp 857 komutuyla), yoksa program dogru cikti uretse bile ekran gosteremeyeceginden
bozuk cikti gorursun.

Aslinda butun problem isletim sisteminden kaynaklaniyor, vistayi bilmiyorum ama xp ve oncesin OS lerde, farkli codepage ler kullaniliyor.eger unix dunyasinda ki gibi utf-8 e gecilse butun bu problemler cozulmus olacak(ki buyuk ihtimalle gecilecektir)

nibble
09/03/2008, 22:25
xp sp2 consol 857 fakat devc++ da setlocal çalışmıyo bende.

acehreli
10/03/2008, 03:02
nibble, senin cozumun belirli bir ortamdaki sorunu cozuyor herhalde. Anlasilan o ortamda yazilan kaynak kodda 'isim'in icine yerlestirilen karakterler oyle -2 gibi degerler aliyorlar. Ama oyle olmaz zorunda degil. Tabii senin icin calistiysa bir sey diyemeyiz.

Yine de, kullandigin yontem her karakter icin 12 kere karsilastirma yapiyor. Turkce olsun olmasin, her karakter 12 kere karsilastirilacak. Onun yerine, butun dOnUsumleri barindiran bir dizi olsa, tek harekette de dOnUsturebiliriz:

/* Her karakterin hangi karaktere dOnUstugunu tutuyor */
const char donusum[256] = { 0, 1, /* ... */, 141, 159, 255 };

Ornegin -2 (yani 254) yerinde 159 var... Sonra:

unsigned int hangisi = isim[i]; /* diziye eksi degerle erismeyelim diye */
isim[i] = donusum[hangisi];

Ali

bluekid
10/03/2008, 09:32
olayın sebebi DOS taki türkçe karekterlerin ASCII kodlarıyla windowstakiler farklı nibble ın çözümü ona dayanıyor

nibble
10/03/2008, 12:59
msdos codepage 857 de ascii tablosunun extended bölümünde Türkçe karakterler var.
char isim[]={"şğüi"};
printf("%d", isim[i]);
yazdığımda türkçe karakterlerin sayısal değerini eksi olarak veriyo. bu sanırım regular ascii tablosunun 0,127 extended bölümünün -1,-128 olarak gösterilmesiyle ilgili ama çok geniş bi bilgim yok. bende basit bi karşılaştırmayla eksi değeri veren Türkçe karakterlerin yerine ascii kodlarını girerek dosta çıktı alınabilir diye düşündüm. yazdığım kod belirttiğim gibi amatörce bi kod.

nibble
10/03/2008, 14:29
bide belirli bi ortam derken sadece benim msdosumda değil codepage i 857 olan bütün mdoslarda sonucun aynı olacağını düşünüyorum.

acehreli
10/03/2008, 17:26
bluekid, benim onerdigim cozum de nibble'inkinin aynisi. Tek farki, nibble'inkinde her karakter icin 12 karsilastirma yapiliyor, benimkinde hic bir karsilastirma yapilmadan, donusum degeri dogrudan bir diziden okunuyor.

nibble, 'isim' icinde Turkce olarak gordugun karakterler, kullandigin metin duzenleyicinin fontlari sayesinde sana oyle gorunuyor olabilir. Eger metin duzenleyici 857'den baska bir codepage kullaniyorsa, donusumler de yanlis olur.

Ali

nibble
10/03/2008, 17:43
haklısın acehreli onu düşünmemiştim. benimki zaten günü kurtarmaya yönelik geçici bi çözüm :) . stabil bi çözüm mutlaka olmalı ama şuan elimdekinin en iyisi bu. araştırmaya devam ediyorum.

bluekid
11/03/2008, 09:07
@acehreli
"senin cozumun belirli bir ortamdaki sorunu cozuyor herhalde"

kısmına cevap olarak yazdım çözümünüze bir şey demedim ben olayın kökenini söyledim vakti zamanında - hey gidi günler hey - windows yokken ms-dos da böyleydi windows çıkınca ne hikmetse bilemiyeceğim türkçe karekterlerin ascii kodlarını değiştirmişti
böylece bir ikiliktir gidiyor windowsta yazdığın türkçe karekter consolda başka görünüyor consola göre hazırladığın windowsta başka görünüyor.

utdemir
11/03/2008, 18:18
Arkadaşlar, aradığım bu çözümün bilgisayardan bilgisayara değişmemesi gerekiyor... Sadece benim bilgisayarımda çalışmayacak çünkü bu program...

acehreli
11/03/2008, 19:45
utdemir, golgepapaz'in gosterdigi cozum isine yaramadi mi yani?

Ali

utdemir
11/03/2008, 19:49
utdemir, golgepapaz'in gosterdigi cozum isine yaramadi mi yani?

Ali



R\Desktop\Hesap Makinesi++\Hesap Makinesi ++\main.cpp||In function `int main(int, char**)':|
R\Desktop\Hesap Makinesi++\Hesap Makinesi ++\main.cpp|26|error: `wcout' was not declared in this scope|
R\Desktop\Hesap Makinesi++\Hesap Makinesi ++\main.cpp|27|converting to execution character set: Illegal byte sequence|
||=== Build finished: 2 errors, 0 warnings ===|



Hatasi veriyor o kod...