August 22, 2013

CodePage degeri yani

SetConsoleCP();

CTP_UTF8 olarak da ayarlanabiliyor.

SetConsoleCP(CP_UTF8);
SetConsoleOutputCP(CP_UTF8);

Bu calisir mi acaba?

C++'da bunun icin

WideCharToMultiByte ve MultiByteToWideChar ozellikleri vardi galiba. Windows icin boyleydi de D dilinde de kullanilabilirligi var mi bilmiyorum.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 22, 2013

Enteresan bir şekilde D için kodları denediğimde kod olarak 65001 kabul gördü, 1254 değil. D için şöyle bir kod yazdım:

import std.stdio;
import core.sys.windows.windows;

extern(Windows) {
   bool SetConsoleCP(uint wCodePageID);
   bool SetConsoleOutputCP(uint wCodePageID);
}

void main() {
   SetConsoleCP(65001);
   SetConsoleOutputCP(65001);

   stdout.writeln("Türkçe Karakterler: ı I İ i ö Ö ü Ü ğ Ğ ç Ç ş Ş");
}

bu kod çalıştı. 65001 yerine 1254 yazınca karakterler bozuk çıktı. Aynı API fonksiyonu ancak farklı değer istiyor, garip! :)

Ekleme:

Ya şöyle bir durum var. Code::Blocks kullanıyorum. c++ için döküman encodingini UTF-8 yapınca bu sefer de D'de olduğu gibi 65001 çalıştı, 1254 bozuk karakter çıkardı.

Özet:

Döküman encodingi UTF-8 ise 65001 çalışıyor, WINDOWS-1254 ise 1254 çalışıyor. Forumdakiler genelde UTF-8 ile çalışıyor galiba? O yüzden kod olarak bu mesajdaki kodu kullansak problem çıkmaz herhalde.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 22, 2013

Alıntı (emre413):

>

Enteresan bir şekilde D için kodları denediğimde kod olarak 65001 kabul gördü, 1254 değil. D için şöyle bir kod yazdım:

> import std.stdio;
> import core.sys.windows.windows;
>
> extern(Windows) {
>     bool SetConsoleCP(uint wCodePageID);
>     bool SetConsoleOutputCP(uint wCodePageID);
> }
>
> void main() {
>     SetConsoleCP(65001);
>     SetConsoleOutputCP(65001);
>
>     stdout.writeln("Türkçe Karakterler: ı I İ i ö Ö ü Ü ğ Ğ ç Ç ş Ş");
> }
> ```

>
> bu kod çalıştı. 65001 yerine 1254 yazınca karakterler bozuk çıktı. Aynı API fonksiyonu ancak farklı değer istiyor, garip! :)
>

Bende hala calismadi 65001 ya da 1254 :(

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
August 22, 2013

Alıntı (agora):

>

Alıntı (emre413):

>

Enteresan bir şekilde D için kodları denediğimde kod olarak 65001 kabul gördü, 1254 değil. D için şöyle bir kod yazdım:

> > import std.stdio;
> > import core.sys.windows.windows;
> >
> > extern(Windows) {
> >     bool SetConsoleCP(uint wCodePageID);
> >     bool SetConsoleOutputCP(uint wCodePageID);
> > }
> >
> > void main() {
> >     SetConsoleCP(65001);
> >     SetConsoleOutputCP(65001);
> >
> >     stdout.writeln("Türkçe Karakterler: ı I İ i ö Ö ü Ü ğ Ğ ç Ç ş Ş");
> > }
> > ```

> >
> > bu kod çalıştı. 65001 yerine 1254 yazınca karakterler bozuk çıktı. Aynı API fonksiyonu ancak farklı değer istiyor, garip! :)
> >
>
> Bende hala calismadi 65001 ya da 1254 :(
>

öncelikle komut satırı özelliklerinden yazı tipini Lucida Console yapmak gerekiyor. Ali hocamın da dediği gibi çıkış UTF-8 olsa bile konsolun bunu algılaması gerekli. Lucida Console UTF-8 karakter encodingini destekliyor. Windows'un varsayılan Consolas yazı tipi desteklemiyor.

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
August 22, 2013

Alıntı (acehreli):

>

Alıntı (emre413):

>

c++ için döküman encodingini UTF-8 yapınca bu sefer de D'de olduğu gibi 65001 çalıştı

Öyle yapınca kaynak kod içindeki dizgi hazır değeri içindeki ü karakteri de dizgide iki bayt yer tutmaya başladı. (strlen ile bakabilirsin.) Dolayısıyla, ü karakteri iki bayt ile temsil ediliyorsa konsolun da o iki bayta karşılık ü'yü gösterecek biçimde ayarlanması şart.

Ali

evet hocam dediğiniz gibi.

   const char* cumle = "ŞşÜü";

   int len = strlen(cumle);

   cout << "len = " << len << endl;

çıktı olarak len = 8 veriyor.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 22, 2013

Alıntı (emre413):

>

Alıntı (agora):

>

Alıntı (emre413):

>

Enteresan bir şekilde D için kodları denediğimde kod olarak 65001 kabul gördü, 1254 değil. D için şöyle bir kod yazdım:

> > > import std.stdio;
> > > import core.sys.windows.windows;
> > >
> > > extern(Windows) {
> > >     bool SetConsoleCP(uint wCodePageID);
> > >     bool SetConsoleOutputCP(uint wCodePageID);
> > > }
> > >
> > > void main() {
> > >     SetConsoleCP(65001);
> > >     SetConsoleOutputCP(65001);
> > >
> > >     stdout.writeln("Türkçe Karakterler: ı I İ i ö Ö ü Ü ğ Ğ ç Ç ş Ş");
> > > }
> > > ```

> > >
> > > bu kod çalıştı. 65001 yerine 1254 yazınca karakterler bozuk çıktı. Aynı API fonksiyonu ancak farklı değer istiyor, garip! :)
> > >
> >
> > Bende hala calismadi 65001 ya da 1254 :(
> >
>
> öncelikle komut satırı özelliklerinden yazı tipini Lucida Console yapmak gerekiyor. Ali hocamın da dediği gibi çıkış UTF-8 olsa bile konsolun bunu algılaması gerekli. Lucida Console UTF-8 karakter encodingini destekliyor. Windows'un varsayılan Consolas yazı tipi desteklemiyor.
>

O zaman konsol fontunu degistirmek gerekiyo galiba. Burada iste onceki mesajlarda yazdigim WideChar ve MultiByteTo fonksiyonlarinin kullanimi gerekiyo ancak o D'de var mi bilmiyorum. Onu kullanarak da UTF-8 vs. ayarlamalar yapilabiliyordu.

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
August 22, 2013

agora galiba sen kod ile konsol fontunu değiştirmekten bahsediyorsun? öyleyse onun nasıl yapıldığını bilmiyorum ancak ben manuel olarak fontu değiştirdiğimde çalışıyor. Hemen araştırıyorum kod ile nasıl yapıldığını :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 22, 2013

Alıntı (emre413):

>

agora galiba sen kod ile konsol fontunu değiştirmekten bahsediyorsun? öyleyse onun nasıl yapıldığını bilmiyorum ancak ben manuel olarak fontu değiştirdiğimde çalışıyor. Hemen araştırıyorum kod ile nasıl yapıldığını :)

Evet evet. Cunku bu islemlerin manuel olarak yapilmasi pek saglikli degil yani saglik demeyeyim de yorucu olabilir. Otomasyona ugramasi daha guzel olmaz mi?

Duzenleme:

Ali hocam afedersiniz tekrar olmaz haklisiniz tesekkur ederim :)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 22, 2013

Alıntı (agora):

>

Evet evet. Cunku bu islemlerin manuel olarak yapilmasi pek saglikli degil yani saglik demeyeyim de yorucu olabilir. Otomasyona ugramasi daha guzel olmaz mi?

Duzenleme:

Ali hocam afedersiniz tekrar olmaz haklisiniz tesekkur ederim :)

Biraz araştırma yaptım. Bir kod buldum ama düzgün çalışmıyor. Derleniyor (yalnızca Visual C++ ile yani D'ye adapte edebilir miyiz bilemiyorum) ancak konsol yazı tipini değiştiremiyor.

#include "stdafx.h"
#include <windows.h>
#include <conio.h>
#include <iostream>

using namespace std;

int main( int, char *[] )
{
	PCONSOLE_FONT_INFOEX lpConsoleCurrentFontEx = new CONSOLE_FONT_INFOEX;

	lpConsoleCurrentFontEx->cbSize = sizeof(CONSOLE_FONT_INFOEX);

	GetCurrentConsoleFontEx(GetStdHandle (STD_OUTPUT_HANDLE), NULL, lpConsoleCurrentFontEx); //retrive all console font informations

	swprintf_s(lpConsoleCurrentFontEx->FaceName, L"Lucida Console");

	SetCurrentConsoleFontEx(GetStdHandle(STD_OUTPUT_HANDLE), NULL, lpConsoleCurrentFontEx);

	SetConsoleCP(1254);
	SetConsoleOutputCP(1254);

       cout << "Türkçe Karakterler: ı I İ i ö Ö ü Ü ğ Ğ ç Ç ş Ş" << endl;

	delete lpConsoleCurrentFontEx;

	system("PAUSE");
	return EXIT_SUCCESS;
}

Bu kodun sorunu ne olabilir? Derleniyor ancak herhangi bir işlev görmüyor. Font değişmiyor.

Sorunu bulabilir miyiz, bulsak da kodu D'ye adapte edebilir miyiz bilemiyorum.

Ekleme:

Bu dediğim ayar bir kereliğine yapılıyor. Yani her programı çalıştırdığımızda yapmak zorunda değiliz. Biraz amatörce bir yaklaşım olacak ama :) projelerde kullanıcıya ayarın nasıl yapılacağını gösteren bir açıklama yapsak, Ali hocam burada (http://ddili.org/forum/post/8) ayarın nasıl yapılacağını anlatmış.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

August 22, 2013

Çok ilginç ama bende girişten alınan bilgilerin Türkçe karakter sorunu yok. Kaynak kodda var bu sorun.. Yani kullanıcı'dan girişten değer alınırsa Türkçe karakterde sorun yok. Ancak kaynak kodda belirlenmiş bir karakteri ekrana yazdırınca sorun var.

İlk Değer Çıktısı =>

Test surusu

ğüşçöoı // girilen değer
k1471065822dF42C48511C2F31FA01449C28202B84849223372036854775808b // kendi şifrelememle olan değer

ğüşçöoı // girilen değeri daha sonra tekrar yazdırdım
Press any key to continue . . .

Yani bu koda bakacak olursak ilk girdiğim değeri tekrar ekrana vurunca örneğin

string a;

Sifreleme(a);

writeln(a);

Çıktılar doğru düzgün. Şimdi benim de aklımda bi soru işareti oldu. Madem kaynak koddan çıkanlarda Türkçe karakter sorunu var.. O zaman Sifreleme() işlevini main.d içinde kullandığımda türkçe karakterleri bozuk mu çıkarıyor kafam karıştı da.

Bir işlevi değer aldığı anda ekrana yazdırabiliyor muyuz? Örneğin

**writeln("Test surusu\n");
string a = chomp(readln());

Sifreleme(a); /* s output: q1471065822r03C7C0ACE395D80182DB07AE2C30F0349223372036854775808l */**

Ben onu writeln(Sifreleme(a)); yaparsam hata verecekmis gibi hissediyorum.

Duzenleme:

Az onceki ilk değer çıktısında girilen değerin Türkçe çıktı verdiğini görüyoruz. Büyük ihtimal o zaman şifrelenen değerin içerikleri de Türkçe ama bir de şuna bakın

İkinci Değer Çıktısı =>

Test surusu

ğşıöçü
s1471065822o06FC4859709791CA520C0B8A88BE48859223372036854775808a
─ş┼ş─▒├Â├ğ├╝ // hata var
Press any key to continue . . .

Burada hata var diye belirttiğim kısım kullanıcıdan değer alınarak değil, manuel olarak kaynak kodda writeln içinde yazdırılıyor.

Şimdi merak ettiğim şey.. Kullanıcıdan değer alınca sorun yok, ama kendimiz manuel yazdirinca neden sorun var karakterde?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]