setlocale fonksiyonu kullanımı ile ilgili sorular

Başlatan blacksnow, 01 Ağustos 2015 - 12:37:02

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

blacksnow

Yaklaşık 2 gündür araştırmaktayım.setlocale fonksiyonunun tarih, zaman, para birimi ve dünya üzerindeki büyük sayılar için değişik gösterim biçimlerinin doğru bir şekilde kullanılmasını sağladığını biliyorum.Bunların yanında karakter setleri üzerinde etksi olduğunu biliyorum fakat o etkisini tam anlayamadım.

Örneğin, Windows'ta setlocale(LC_ALL, "turkish"); yazdıktan sonra Türkçe karakterler doğru bir şekilde gösteriliyor.Ubuntu' da ise herhangi bir şey yazmama gerek olmuyor.Bunun UTF-8 ile ilgili olduğunu biliyorum fakat nasıl olduğunu bilmiyorum.Bu anlayamadığım birinci nokta.

Aşağıda varsayılan locale' ın "C" olduğunu görüyoruz.Bildiğim kadarıyla C locale' ında ASCII karakter seti tanımlı(yanlış biliyor olabilirim).O zaman türkçe karakterler nasıl doğru gösteriliyor?Bu da anlayamadığım ikinci nokta.

#include<stdio.h>
#include<locale.h>
int main()
{
printf("Locale is: %s\n", setlocale(LC_ALL, NULL));
printf("üğşçö\n");

return 0;
}

Çıktı:
Locale is: C
üğşçö


Not 1: Verdiğim örnek Ubuntu üzerinde denenmiştir.
Not 2: Başlığı daha uygun şekilde değiştirdim.

heartsmagic

C diliyle ilgili tarafını bilmiyorum ancak C yereline geçtiğimizde mevcut bir dosya içeriğindeki Türkçe karakterlerin gösteriminde sıkıntı olacağını sanmıyorum. printf ile de basılabiliyor demek ki.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

betseg

tty3'te filan deneyince sadece Türkçede olan karakterler (ıİğĞşŞ) düzgün çıkmıyor. X'le alakalı bir şey olabilir bence.

ekremsenturk

Alıntı yapılan: betseg - 04 Ağustos 2015 - 09:34:45
tty3'te filan deneyince sadece Türkçede olan karakterler (ıİğĞşŞ) düzgün çıkmıyor. X'le alakalı bir şey olabilir bence.

Terminal'in veya terminal'i kullanan kullanıcının varsayılan ayarları ile ilgili bir durum.

blacksnow

#4
Alıntı yapılan: betseg - 04 Ağustos 2015 - 09:34:45
tty3'te filan deneyince sadece Türkçede olan karakterler (ıİğĞşŞ) düzgün çıkmıyor. X'le alakalı bir şey olabilir bence.
Bende tty ekranlarında da düzgün çıkıyor.
Alıntı yapılan: heartsmagic - 04 Ağustos 2015 - 04:04:47
C diliyle ilgili tarafını bilmiyorum ancak C yereline geçtiğimizde mevcut bir dosya içeriğindeki Türkçe karakterlerin gösteriminde sıkıntı olacağını sanmıyorum. printf ile de basılabiliyor demek ki.
Sanırım C yerelinde de UTF-8 kullanılıyor.Bu yüzden Ubuntu tarafında herhangi bir sorun yaşamıyoruz.

ekremsenturk

Windows varsayılan olarak UFT-8'i desteklemiyor. Sanırım Visual Studio ile birlikte kurulan bir kütüphane sayesinde bu desteğe erişiyor. Windows varsayılan olarak UTF-16 desteği veriyor. Bu durum bazı editör ve derleyicilerde sorun yaratabiliyor. İnternet'te bir kaç çözüm önerisine rastlamıştım. Ama denediğim olmadı.

natgho

ben zamanında çok kullanırdım, en son hocam birdaha yazarsan lab notun gider dediğinde bıraktım :)

O komut konsolda türkçe karakterleri yazdırabilmenizi sağlamakta.
Kullanımı şöyle:
Kulanımı kabaca şöyle:
#include <stdio.h>
#include <locale.h>

int main(){

    setlocale(LC_ALL,"Turkish");

    printf("natgho yazışmalarda türkçe karakter kullanabilir ");
    printf("Şayet harflerin gözükmesini istiyorsan üsttekini yaz.");

    system("pause");
    return 0;
    }
Hayır ben Windows Düşmanı Değilim,Bu Yüzden Linux Kullanmıyorum, Ben Sadece Benim Donanımımda At Koşturacaksa Bir Yazılım, her Adımını Bilme Sorumluluğunu Hisseden Bir Teknologtan Fazlası olmadığım İçin Linux Kullanıcısıyım.

blacksnow

Anladığım kadarıyla Windows tarafında C yereli varsayılan olarak Türkçe karakterler içeren bir karakter seti kullanmıyor.Bu yüzden yereli Türkçe yapma gereği duyuyoruz.
Ubuntu tarafında ise C yereli varsayılan olarak UTF-8 kullanıyor gibi.Yukarıdaki çıktı bunu gösteriyor.Fakat bununla ilgili herhangi bir yazı bulamadım.Bir yerde C yerelinin varsayılan karakter setinin ASCII olduğunu okuduğum için Türkçe karakterlerin nasıl düzgün çıktığını anlayamamıştım.Demek ki öyle değilmiş.

-DıLgEş-

İngilizcen var ise terminalden;

man locale

Bu çıktıyı oku...
Aşkın; gözü kör, kulağı sağır, dili tutuk, aklı kıttır..! Hayır yani bu halde nasıl herkesi madara ediyor onu çözemedim..

heartsmagic

Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

blacksnow

#10
Alıntı yapılan: heartsmagic - 06 Ağustos 2015 - 03:32:02
Windows tarafında da olay farklı değil gibi:
http://stackoverflow.com/a/16599415
http://stackoverflow.com/questions/16383069/why-printf-can-display-non-ascii-characters-when-c-locale-is-used

Kısacası arada karakter dönüşümü yapılıyor gibi.
Burada sistem Çince ve C yereli geçerliyken Çince karakterler doğru gösteriliyor.Yereli İngilizce yaptığında da İnglizce'den Çince'ye dönüşüm yapamıyor.
Bende de Windows için, sistem Türkçe ve C yereli geçerliyken Türkçe karakterler doğru gösterilmiyor.Bende neden olmadı o zaman?Durumlar benzer gibi.

Düzenleme:
Yeni bir sorunum var.Konuyla ilişkili olduğundan yeni konu açmak istemedim.Bir geniş karakteri bir değişkene atayıp sonra yazdırmayı denedim.Yereli eğer sistemin varsayılan yereli yapmazsam çıktı "?" olmakta.Eğer yereli varsayılan yaparsam yani sistemin kullandığı yerel ( "tr_TR.UTF-8"), 'ü' karakteri doğru bir şekilde çıkıyor.Yereli illa Türkçe bir yerel yapmakta gerekmiyor herhangi bir UTF-8 yerelinde de çıktı doğru oluyor.Örneğin; setlocale(LC_ALL, "en_GB.UTF-8")

Konunun en başındaki sorunla ilişkilendirdiğimde printf fonksiyonuna yazılan karakterler yerel C olsada herhangi bir dönüşüme uğramayıp direkt konsola yazılıyor gibi.Fakat aşağıdaki durumda bir dönüşüm yapılıyor ve C yerelide 'ü' karakterini tanımıyor gibi.Yorumlarınızı bekliyorum.
#include <stdio.h>
#include <wchar.h>
#include <locale.h>
int main()
{
// setlocale(LC_ALL, "");
wchar_t c = L'ü';
wprintf(L"%lc\n", c);

return 0;
}

heartsmagic

Olay printf'e dayandığı için beni aşıyor. Gerçi yerel meselesi de yeterince karışık, orada da iyi okuma yapmak lazım.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.