Tam Sürümünü Görmek İçin : C ve C++'da türkçe karakter sorunu
psikopat®
07/07/2004, 20:09
Dev-C++ ile yazdığım programlarda türkçe karakter kullandığımda dos ekranında türkçe karakterler gözükmüyor. bunun sebebi nedir? Turbo C ile yazdığımda hiçbir sorun olmuyo ama bu sefer de Turbo C ile yazdığım programı Dev-C++ veya Notepad ile açtığımda Türkçe karakterler normal gözükmüyor, değişik garip işaretler oluyo. bu sorunu nasıl çözebilirim acaba? şimdiden sağolun....
Euclides
07/07/2004, 21:29
Çözemesin OEM ANSI çevrim probleminin en açık örneğini yaşıyorsun.
Tavsiyem artık Win32Conlose App yazman.
psikopat®
07/07/2004, 21:37
o nasıl olacak? biraz bilgi verebilir misin?
Euclides
07/07/2004, 21:46
Visual C++ ve Borland C++ 5 ve üzeri:
VC
Proje yaratırken Win32 Console Application şeçilir. Aynen dos gibi kodlanır.
BC
Proje Platform=win32,Target=Console şeçilir. Aynen dos gibi kodlanır
Genel Yöntem(Diğerleri):
#include <windows.h>
char *szHello="Hello World";
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int CmdShow)
{
HANDLE hStdOut;
DWORD dTmp;
AllocConsole();
hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsole(hStdOut,szHello,strlen(szHello),&dTmp,NULL);
FreeConsole();
return 0;
}
Arkantos
08/07/2004, 09:25
Buna benzer bir soruyu ben de uzun zamandır merak ediyorum.Managed C++ kullanarak konsolda Türkçe karakterleri düzgün olarak gösterebiliyoruz.Peki bunu Standart C++ kullanarak yapmanın bir yolu yok mu?
Ben bu soruyu bir sürü sitede ve bir sürü programcıya sordum.Ama net bir cevap alamadım. En sonunda Bjarne Stroustrup'a bile sordum :) ve bunun Locale (yerelleştirme) kütüphanesi ile yapılabileceğini söyledi.
Soru da şu :
Standart C++ kullanarak konsolda Türkçe karakterleri en basit nasıl görüntüleyebiliriz ? Normalde (örneğin) Managed C++'de kullanıldığı zaman problem olmuyor ama mesela standart c++'de:
#include <iostream>
using namespace std;
int main()
{
cout<<"ĞğŞşıÜüÇç"<<endl;
}
şeklinde Türkçe karakterleri konsolda en kolay yolla nasıl doğru bir
şekilde gösteririz?
Bir arkadaş YazGeliştir sitesinde buna bir cevap vermiş.Henüz çalışıp çalışmadığını kontrol edemedim.Buradan (http://www.yazgelistir.com/forumlar/veri/topic.asp?TOPIC_ID=3354&FORUM_ID=31&CAT_ID=1&Topic_Title=Konsolda+T%FCrk%E7e+Karakterler&Forum_Title=VISUAL+C%2B%2B) soruyu ve buna verilen cevapları inceleyebilirsiniz.. :o
Euclides
08/07/2004, 11:18
@Arkantos
buradaki problem senin notdeferi ile yazdığın karakterler ile dos 'un karakterlerini "farklı" olması.
Arkantos
08/07/2004, 11:27
Peki çözüm hakkında fikir verebilecek arkadaşlar var mı?
Kısaca şöyle söyleyeyim.Ben illa ki windows programı yapmak zorunda değilim. Benim yapmak istediğim yaptığım Konsol,Dos programlarında da Türkçe karakterlerin düzgün gösterilmesi...>ĞğŞşıÜüÇç
Euclides
08/07/2004, 13:14
tabii o zaman programlarını derlemeden önce kaynak kodları bu program ile cevir
OEM,ANSI Converter eklerde..
psikopat®
08/07/2004, 19:23
Euclides gönderdiğin program ç harfini çeviremiyor. zaten çevirse bile o yöntem bence iyi bir çözüm değil. bu işe kesin bir çözüm bulmak lazım.
bir de yukarda "Proje Platform=win32,Target=Console şeçilir." demişsin ama bu ne demek veya nasıl yapılır bilmiyorum. biraz anlatabilir misin?
Euclides
08/07/2004, 19:45
5.01
Menülerden
File-->New--->project...
Dialog Çıkdığında
"Target Type:" yazan yerin altıdaki liste kutusunda "Application[.exe]"'yi
onun hemen altında "Platform:" yazıyor oradan "Win32" yi
onunda hemen altında "Target model" yazuyor oradan "Console"'yi
şeçiniz...
psikopat®
08/07/2004, 20:22
bunu yaparak bütün kodu aynı şekilde yazınca oluyo mu yani? yoksa koda eklemeler yapmam mı gerekiyor?
Euclides
08/07/2004, 21:02
hayır gerekmiyor...
psikopat®
10/07/2004, 14:56
Borland C++ Builder 5.02 ile denedim ama maalesef Win32 seçeceğim bir yer göremedim. ama console wizard kullanarak yaptığımda aynı sorunla yine karşılaştım. sorun nerede olabilir?
Euclides
10/07/2004, 16:20
Eklerdeki program
ekrana "şŞiİğĞçÇöÖ falan filan" yazıyor sanırım probleminizi çözer...
psikopat®
10/07/2004, 16:39
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <windows.h>
int main(void)
{
char *szText="şŞiİğĞçÇöÖ falan filan";
char *szBuf=(char*)malloc(strlen(szText)+1);
CharToOem(szText,szBuf);
printf("%s\n",szBuf);
getch();
return 0;
}
evet bu kod normal çalışıyor ama sadece Borland ile değil. Dev-C++ ile de denedim onda da normal çalışıyor. yani Türkçe karakterler normal gözüküyor.
bu programda anlamadığım birşey var. neden sadece yazı yazdıracak bir programda pointer kullanma gereği duydun. sadece printf kullanarak yazdırsan aynı sonucu elde edemez miydin? bu arada bir de CharToOem fonksiyonunun işlevini açıklar mısın?
Euclides
10/07/2004, 17:54
CharToOem, user32.dll'in bir export'u.
Detaylı açıklaması
http://msdn.microsoft.com/library/en-us/winui/winui/windowsuserinterface/resources/strings/stringreference/stringfunctions/chartooem.asp
psikopat®
11/07/2004, 17:26
Sayısal Loto 1.0.2 (http://www.nicelizm.net/etc/psikopat/sayisal_loto_v1.0.2.exe)
yukardaki linkten son versiyona ulaşabilirsiniz. birkaç özellik ekledim. düşüncelerinizi bekliyorum....
Euclides
11/07/2004, 18:47
güzel bir konsol uygulaması olmuş. :)
Ama merak ettim, program rand()'+mod komutundan sonra 6 tane if veya bir 5'li bir switch dizisi içeriyor. o ne işe yarıyor biraz açıklarmısın ?
psikopat®
11/07/2004, 19:09
void bubbleSort(int x[], int array_size)
{
int i, j, temp;
for (i = (array_size - 1); i >= 0; i--)
for (j = 1; j <= i; j++)
if (x[j-1] > x[j])
{
temp = x[j-1];
x[j-1] = x[j];
x[j] = temp;
}
}
bu sıralama için kullandığım Bubble Sort fonksiyonu. en yavaş sıralama algoritması olduğunu biliyorum ama toplam 6 eleman olduğu için diğer daha hızlı algoritmaları kullanmamın gereksiz olacağını düşündüm.
burdaki if'den başka 2 tane if var. biri seçilen sayıların eşit olması durumunu kontrol ediyor. diğeri ise en sondaki Y/N için n veya N girildiğinde programdan çıkmayı sağlıyor.
ayrıca bunlardan başka toplam 3 tane for döngüsü kullandım. bir for her kolon için, bir for yukarda belirttiğim eşitlik kontrolü için biri de sayıları yazdırmak için.
bu arada sen programda nelerolduğunu nasıl anlıyorsun? disassembler ile mi yapılıyor bu iş? biraz anlatabilir misin?
Euclides
11/07/2004, 19:37
bu arada sen programda nelerolduğunu nasıl anlıyorsun? disassembler ile mi yapılıyor bu iş? biraz anlatabilir misin?
Ben kimseye güvenmediğim için programına troajn gözüyle yaklaştım.
OllyDbg ile programın şöyle gözküyor..
psikopat®
11/07/2004, 19:49
peki trojan falan olsaydı nasıl anlayacaktın? bir de burdan 5 tane if olduğunu nasıl söyledin? (5 tane yoktu ama olsun)
Euclides
11/07/2004, 20:23
1...
for-next,do-while'la if-else arasında bir fark yok hepsi bir x'i denetyeip bir ona göre bir yeri çalıştırıyorlar.
2...
eklerdeki out.txt'ye bak.
00401402'da 1. for
00401429'da 2. for
004014F5'da 3. for
var..
00401429-004014D7 arasında bir kaç tane karşılaştırma işlemi var..
ayrıca bunların hepsini fonksyonun içindeki değişkenlerle yapıyorsun.
biraz daha gidip sana tam algoritmanı verebilirim ama gerek yok...
3....
peki trojan falan olsaydı nasıl anlayacaktın?
Kabaca şöyle..
ntdll.dll'deki NtCreateFile,NtOpenFile,CreateRemoteThread,Virtual AllocEx'nın başına Hardware break point koyuyorum.
File IO sistemini kısmen denetlemiş oluyorum. Bir ollydbg plug-in'i ile int2eh ve sysenter'i da izliyorum.
eğer programın sağa sola bir şeyler kopyalamaya kalkarsa görmüş olurum...
Böyle yapmamın sebebi FileMon programlar atlatılabiliyor.
psikopat®
11/07/2004, 21:33
Euclides verdiğin bilgiler için sağol. ya bu arada ben hala Türkçe karakter sorununu çözemedim. programda doğru gözüküyor ama kaynak kodunda garip işaretler oluyo. bu konuda başka tavsiyen var mı?
Forum Yazılımı : vBulletin v3.7.3, Copyright ©2000-2008, Jelsoft Enterprises Ltd.