C/C++ Türkçe yerelleştirme fonksiyonu çalıştığı zaman NULL döndürüyor

keremdogan1

Centipat
Katılım
17 Temmuz 2022
Mesajlar
2
Daha fazla  
Cinsiyet
Erkek
Windows 11 üzerinden Dev-C++ kullanıyorum ve kodum C dilinde.
Aşağıdaki kodu yazdığım zaman setlocale(LC_CTYPE, "tr_TR.UTF-8") NULL döndürüyor ve notlarımı görüntülediğimde türkçe karakterlerin doğru görüntülenmediğini görüyorum.

Kodum şu şekilde:

C:
#include <stdio.h>
#include <locale.h>
#include "notdefteri.c"

int main() {
    setlocale(LC_CTYPE, "Turkish");  
    int secim;
    char note[100];
    char not_adi[100];
       
    while (1) {
        printf("1. Not Ekle\n");
        printf("2. Notları Görüntüle\n");
        printf("3. Çıkış\n");
        printf("Seçiminizi girin: ");
        scanf("%d", &secim);
       
        switch (secim) {
            case 1:
                if (setlocale(LC_CTYPE, "tr_TR.UTF-8") == NULL) {
                printf("Yerel ayarlar değiştirilemedi\n");}
                printf("Not ismi girin: ");
                scanf(" %[^\n]", not_adi);
                not_adi_ekle(not_adi);
                printf("Not girin: ");
                scanf(" %[^\n]", note);
                not_ekle(note);
                break;
            case 2:
                notlari_goruntule();
                break;
            case 3:
                return 0;
            default:
                printf("Geçersiz seçim\n");
        }
    }
}

notdefteri.c de aşağıdaki gibi:

C:
#include <stdio.h>
#include <string.h>

#define MAX_NOTLAR 100

struct Not {
    char ad[100];
    char icerik[100];
};

struct Not notlar[MAX_NOTLAR];
int not_sayisi = 0;

void notlari_kaydet() {
    FILE *dosya;
    int i;

    dosya = fopen("notlar.txt", "a+");
    if (dosya == NULL) {
        printf("Dosya açılamadı\n");
        return;
    }

    for (i = 0; i < not_sayisi; i++) {
        fprintf(dosya, "%s\n%s\n", notlar[i].ad, notlar[i].icerik);
    }

    fclose(dosya);
}

void notlari_yukle() {
    FILE *dosya;
    char ad[100];
    char icerik[100];

    dosya = fopen("notlar.txt", "r");
    if (dosya == NULL) {
        return;
    }

    not_sayisi = 0;
    while (fscanf(dosya, "%99[^\n]\n%99[^\n]\n", ad, icerik) == 2) {
        strcpy(notlar[not_sayisi].ad, ad);
        strcpy(notlar[not_sayisi].icerik, icerik);
        not_sayisi++;
    }

    fclose(dosya);
}

void not_adi_ekle(char *not_adi) {
    if (not_sayisi == MAX_NOTLAR) {
        printf("Not defteri dolu\n");
        return;
    }

    strcpy(notlar[not_sayisi].ad, not_adi);
}

void not_ekle(char *note) {
    if (not_sayisi == MAX_NOTLAR) {
        printf("Not defteri dolu\n");
        return;
    }

    strcpy(notlar[not_sayisi].icerik, note);
    not_sayisi++;
    notlari_kaydet();
}

void notlari_goruntule() {
    int i;

    notlari_yukle();

    for (i = 0; i < not_sayisi; i++) {
        printf("%d. %s: %s\n", i + 1, notlar[i].ad, notlar[i].icerik);
    }
}

Örnek bir girdiyi ekran görüntüsü alarak gösterdim.
 

Dosya Ekleri

  • Ekran görüntüsü 2023-06-08 155302.png
    Ekran görüntüsü 2023-06-08 155302.png
    28 KB · Görüntüleme: 41
Son düzenleyen: Moderatör:
Wide char kullanmalısın. C için örnek kod ekliyorum.

C:
#include <stdio.h>
#include <fcntl.h>

int main() {

 
   _setmode(_fileno(stdout), _O_U16TEXT);
   _setmode(_fileno(stdin), _O_U16TEXT);

    wchar_t test[120];

    wprintf(L"türkçe öçişğ\n");
    wscanf(L"%s", test);
    wprintf(L"çıktı: %s ", test);

}
 
Son düzenleme:
Wide char kullanmalısın. C için örnek kod ekliyorum.

C:
#include <stdio.h>
#include <fcntl.h>

int main() {

 
   _setmode(_fileno(stdout), _O_U16TEXT);
   _setmode(_fileno(stdin), _O_U16TEXT);

    wchar_t test[120];

    wprintf(L"türkçe öçişğ\n");
    wscanf(L"%s", test);
    wprintf(L"çıktı: %s ", test);

}
Wide char ve _setmode() hakkında biraz araştırma yaptım, sanırım unicode karakterlerini destekleyen giriş ve çıktılar oluşturmamı sağlıyorlar. Şuan kodu deneyemiyorum ancak muhtemelen bu fonksiyonlar işimi görecektir, bir sorun olursa yazarım. Teşekkürler.

Şu anda Windows 11 bir makineye erişimim yok ama araştırdığım kadarıyla pek çok yer yerelleştirmenin "tr_TR.UTF-8" şeklinde değil de setlocale(LC_ALL, "Turkish"); ya da setlocale(LC_CTYPE, "turkish"); şeklinde yapılması gerektiğini belirtmişler.

UTF-8 kullanmadığım zaman dosyanın içine Türkçe karakter yazmıyordu.

Switch içinde tekrar setlocale kullanma.
Dönüş değerinin 0 olduğunu belirtmek için kullandım.

Wide char kullanmalısın. C için örnek kod ekliyorum.

C:
#include <stdio.h>
#include <fcntl.h>

int main() {

 
   _setmode(_fileno(stdout), _O_U16TEXT);
   _setmode(_fileno(stdin), _O_U16TEXT);

    wchar_t test[120];

    wprintf(L"türkçe öçişğ\n");
    wscanf(L"%s", test);
    wprintf(L"çıktı: %s ", test);

}
Kodu yazdığım zaman derleyicimden mi kaynaklı bilmiyorum ama wprintf ile türkçe karakter kullanılarak yazılmış satırlar için şu hatayı verdi:
[Error] converting to execution character set: Illegal byte sequence
 
Son düzenleme:
Wide char ve _setmode() hakkında biraz araştırma yaptım, sanırım unicode karakterlerini destekleyen giriş ve çıktılar oluşturmamı sağlıyorlar. Şuan kodu deneyemiyorum ancak muhtemelen bu fonksiyonlar işimi görecektir, bir sorun olursa yazarım. Teşekkürler.



UTF-8 kullanmadığım zaman dosyanın içine Türkçe karakter yazmıyordu.


Dönüş değerinin 0 olduğunu belirtmek için kullandım.


Kodu yazdığım zaman derleyicimden mi kaynaklı bilmiyorum ama wprintf ile türkçe karakter kullanılarak yazılmış satırlar için şu hatayı verdi:
[Error] converting to execution character set: Illegal byte sequence
Editor kaynaklı, edit menusunden use utf8 secenegini secip bir de oyle dene ayrıca derleyici ayarları kısmında da utf8 ile ilgili bir ayar olması gerekiyordu onları da bir kurcalarsın.
 

Technopat Haberler

Geri
Yukarı