Çözüldü C++ Türkçe karakterler bozuk

Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

gncyblr

Attopat
Katılım
1 Kasım 2021
Mesajlar
11
Çözümler
1
Daha fazla  
Cinsiyet
Erkek
Merhabalar,
Clocale kütüphanesini kullanmama rağmen karakterler neden bozuk gösteriliyor?

[CODE lang="cpp" title="main.cpp"]#include <iostream>
#include <clocale>

using namespace std;

int main(){

setlocale(LC_ALL, "Turkish");

cout << "Merhaba, Dünya!" << endl;

system("Pause");

return 0;
}[/CODE]

Çıktı:

1638048730683.png
 
Çözüm
UTF-16 ile geniş karakter dizeleri kullanmalısın. Bu kod sorununu çözer.

C++:
#include <iostream>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"Türkçe öğreniyorum!\n";
    return 0;
}
C++:
    std::setlocale(LC_ALL, "Turkish");
    std::locale::global(std::locale("Turkish"));
    std::cout.imbue(std::locale());
Bu şekilde kullanıp dene.
 
Bunu dener misiniz?
C++:
#include <iostream>
using namespace std;
int main()
{
   setlocale(LC_ALL,"Turkish"); //Türkçe karakter
   cout<<"Merhaba Dünya! ";
}
cıktı2.PNG


C++:
    std::setlocale(LC_ALL, "Turkish");
    std::locale::global(std::locale("Turkish"));
    std::cout.imbue(std::locale());
Bu şekilde kullanıp dene.
Kodun gerekli kısımlarına ekledim ve şu çıktıyı aldım, ancak system("Pause"); kullanmama rağmen 2 saniye geçmeden otomatik olarak kapatıyor kendini.

hata.PNG
 
Eki Görüntüle 1227677

Kodun gerekli kısımlarına ekledim ve şu çıktıyı aldım, ancak System("pause"); kullanmama rağmen 2 saniye geçmeden otomatik olarak kapatıyor kendini.

Eki Görüntüle 1227680

Kod:
#include <Winnls.h>
#include <iostream>
#include <ostream>

using namespace std;

int size = 0;

BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam) {
 size++;
 wcout << *pStr << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
 EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALL, NULL, NULL);
 wcout << "Total " << size << " locales found." << endl;
 return 0;
}

Bu kod ile erişilebilir localeleri listeleyip "Turkish" var mı kontrol edin.
 
UTF-16 ile geniş karakter dizeleri kullanmalısın. Bu kod sorununu çözer.

C++:
#include <iostream>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"Türkçe öğreniyorum!\n";
    return 0;
}
 
Çözüm
Kod:
#include <Winnls.h>
#include <iostream>
#include <ostream>

using namespace std;

int size = 0;

BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam) {
 size++;
 wcout << *pStr << endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
 EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALL, NULL, NULL);
 wcout << "Total " << size << " locales found." << endl;
 return 0;
}

Bu kod ile erişilebilir localeleri listeleyip "Turkish" var mı kontrol edin.
1.PNG

Derlemek istediğimde çıkan hata :
main.cpp: In function 'BOOL MyFuncLocaleEx(LPWSTR, DWORD, LPARAM)':
main.cpp:12:1: warning: no return statement in function returning non-void [-Wreturn-type]
}
^
main.cpp: At global scope:
main.cpp:14:22: error: '_TCHAR' has not been declared
int _tmain(int argc, _TCHAR* argv[])
^~~~~~
main.cpp: In function 'int _tmain(int, int**)':
main.cpp:16:38: error: 'LOCALE_ALL' was not declared in this scope
EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALL, NULL, NULL);
^~~~~~~~~~
main.cpp:16:38: note: suggested alternative: 'LOCALE_SDATE'
EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALL, NULL, NULL);
^~~~~~~~~~
LOCALE_SDATE
main.cpp:16:2: error: 'EnumSystemLocalesEx' was not declared in this scope
EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALL, NULL, NULL);
^~~~~~~~~~~~~~~~~~~
main.cpp:16:2: note: suggested alternative: 'EnumSystemLocalesW'
EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALL, NULL, NULL);
^~~~~~~~~~~~~~~~~~~
EnumSystemLocalesW

UTF-16 ile geniş karakter dizeleri kullanmalısın. Bu kod sorununu çözer.

C++:
#include <iostream>
#include <fcntl.h>

int main() {
    _setmode(_fileno(stdout), _O_U16TEXT);
    std::wcout << L"Türkçe öğreniyorum!\n";
    return 0;
}
Evet, sorunu çözdüm bu kodlar sayesinde. Metnin önüne getirilen "L" ve U16 geniş karakter dizisi hakkında doğru bilgiler içeren kaynaklar gönderebilir misiniz acaba? İlk attığım koddaki gibi hatalı/eksik bilgiler atan çok kişi olduğuna eminim (Buraya gönderilen cevapları değil, Türkçe karakter kullanımını öğretmeye çalışan web sitelerini kast ediyorum, yanlş anlaşılmasın) ve kaynakların doğruluğunu henüz karşılaştıramıyorum.
Derleyici ayarlarına girip ekran görüntüsü atar mısın?
Derleyici ayarlarına nasıl ulaşabilirim? MinGW 8.1.0 kullanıyorum.
 
Metinlerin başına L eklememizin sebebi bunu wide char'a dönüştürmek için. Normalde dizi tanımlarken char kullanırız lakin char 1 byte'dır ve geniş karakter dizelerini tutmada yetersiz kalır, bunun yerine wchar_t kullanıyoruz bu ise 2byte'dir.

C++:
    _setmode(_fileno(stdout), _O_U16TEXT);
    _setmode(_fileno(stdin), _O_U16TEXT);

Biz kodu sadece standart output için utf-16 ayarladık yani yazdırdığımız kodu türkçe yazdıracak ancak girdiğimiz kodu da türkçe algılayabilmesi için standart input için de aynı tanımlamayı yapıyoruz.

wide char ile çalışırken string yerine wstring, cin yerine wcin cout yerine de wcout kullanırız. bunlar karakter başına 2 byte ayırır.

Takıldığın yer olursa yazarsın vaktim olunca cevaplarım, kolay gelsin.
 

Geri
Yukarı