Jak wyświetlić polskie znaki w terminalu?

0

Cześć, liczę, że tym razem się uda. Otóż język C, CodeBlocks i polskie znaki...
Tworzę program, który będzie pytał użytkownika o wprowadzenie wartości m.in. imię,nazwisko i zmienne T/N, 1-5 itp.
Co zrobić aby program(w wersji konsolowej) wyświetlał polskie znaki? Ostatecznie program ma wynik zapisywać do pliku txt, wynik w pliku txt również nie ma polskich znaków a chce aby miał.
Co zrobić? Zastosowałem już te opcje:

Chcę aby to działało dla użytkowników Windows'a.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <wchar.h>
#include <windows.h>

int main()
{
    setlocale(LC_ALL, "pl_PL.UTF-8");

    char imie[1][30];
    char nazwisko[1][30];
    FILE *plik;

    //...Linijki kodu nieznaczące, zawierające polskie znaki w printf("ł,ź,ż,ó,ę,ń...");

    plik = fopen("plik.txt", "w");

    //...Linijki kodu nieznaczące, zawierające polskie znaki w printf("ł,ź,ż,ó,ę,ń...");

    fprintf(plik, "Imię i nazwisko %s",imie, nazwisko);
    fclose(plik);

    return 0;
}
0

Zapisz plik z kodem źródłowym w kodowaniu Windows-1250 lub w kodowaniu UTF-8. Może to mieć znaczenie, szczególnie, gdy kompilator nie jest częścią IDE, tylko osobnym programem. Nie znam CodeBlocks, ale na przykład QtCreator nie ma kompilatora w sobie, tylko odpala GCC lub MinGW w celu skompilowania, w takiej sytuacji nie ma znaczenia, w jakim programie piszesz kod, ale ma znaczenie, w jakim kodowaniu są zapisane pliki.

Ewentualnie, zamiast polskich znaków zastosuj "kody ucieczki" i w ich miejsce wpisz numery znaków. Chodzi o to, żeby w pliku nie było innych znaków niż ASCII, wtedy nie będzie zależności działania programu od kodowania tekstu w pliku

Czy jak użytkownik wpiszę napis z polską literą, to czy ona się pojawia na ekranie i w pliku?

Zobacz w hex-edytorze, jakie bajty są faktycznie w pliku, może notatnik źle odczytuje kodowanie?

0
andrzejlisek napisał(a):

Zapisz plik z kodem w kodowaniu Windows-1250 lub w kodowaniu UTF-8. Może to mieć znaczenie.

Ewentualnie, zamiast polskich znaków zastosuj "kody ucieczki" i w ich miejsce wpisz numery znaków.

Czy jak użytkownik wpiszę napis z polską literą, to czy ona się pojawia na ekranie i w pliku?

Zobacz w hex-edytorze, jakie bajty są faktycznie w pliku, może notatnik źle odczytuje kodowanie?

Zapisać plik z kodem w kodowaniu -1250 lub UTF-8 masz na myśli Settings>>Editor>>Encoding settings i tam zmienić? Ani 1250 ani UTF-8 nie działa

numery z tablicy ASCII, tak? A jeśli użytkownik wprowadzi w nazwisku polski znak? Da się do tego zaprogramować ASCII by podkładał odpowiedni numer?

Jak użytkownik wpisze to tak, pojawia się w konsoli, w pliku nie(błędnie w pliku zapisuje polskie znaki)

Nie rozumiem tego podpunktu, notatnik raczej dobrze odczytuje kodowanie(na 90%)

2

Ja zaproponuje ten watek
https://4programmers.net/Forum/C_i_C++/367879-problem_z_wczytaniem_polskich_znakow_z_pliku_tekstowego_jezyk_c
pojawia sie tam rozwiązanie chcp 65001 (ustawienie stron kodowej konsoli)

0

Zapisać plik z kodem w kodowaniu -1250 lub UTF-8 masz na myśli Settings>>Editor>>Encoding settings i tam zmienić? Ani 1250 ani UTF-8 nie działa

Najproawdopodobniej tak, jak wspomniałem, nie znam CodeBlock, nie posiadam go, ale jeżeli to jest kodowanie zapisu plliku (efekt zmiany będzie widoczny, jak plik z kodem otworzysz w hex-edytorze), to jest to coś, o czym myślę.

numery z tablicy ASCII, tak? A jeśli użytkownik wprowadzi w nazwisku polski znak? Da się do tego zaprogramować ASCII by podkładał odpowiedni numer?

Widzę, że wypisujesz do pliku hardkodowany napis ("imię i nazwisko") i tekst podany przez użytkownika. W którym tekście polskie znaki są źle wypisane?

Nie rozumiem tego podpunktu, notatnik raczej dobrze odczytuje kodowanie(na 90%)

Zrób taki test i zobacz, czy w pliku pojawi się znak ą, najlepiej pokaż zawartość pliku w hex-edytorze.

    char test[30];
    test[0] = 'a';
    test[1] = ' ';
    test[2] = 'ą';
    test[3] = ' ';
    test[4] = 'a';
    test[5] = ' ';
    test[6] = 0xB9; // znak ą w kodowaniu Windows 1250
    test[7] = ' ';
    test[8] = 'a';
    test[9] = ' ';
    test[10] = 0xC4; // znak ą w kodowaniu UTF 8
    test[11] = 0x85;
    test[12] = ' ';
    test[13] = 'a';
    test[14] = 0;
    printf("a ą a \xB9 a \xC4\x85 a | %s", test);
    fprintf(plik, "a ą a \xB9 a \xC4\x85 a | %s", test);
    fclose(plik);

numery z tablicy ASCII, tak? A jeśli użytkownik wprowadzi w nazwisku polski znak? Da się do tego zaprogramować ASCII by podkładał odpowiedni numer?

Nie chodzi tu o jakąkolwiek konwersję, tylko o to, żeby kod źródłowy nie zawierał polskich znaków. Ale i tak rozumiem, że wykluczyłeś sposób kodowania pliku z źródłem jako możliwą przyczynę problemu.

0

możesz zacząć od sprawdzania błędu na setlocale....

0
andrzejlisek napisał(a):

Zapisać plik z kodem w kodowaniu -1250 lub UTF-8 masz na myśli Settings>>Editor>>Encoding settings i tam zmienić? Ani 1250 ani UTF-8 nie działa

Najproawdopodobniej tak, jak wspomniałem, nie znam CodeBlock, nie posiadam go, ale jeżeli to jest kodowanie zapisu plliku (efekt zmiany będzie widoczny, jak plik z kodem otworzysz w hex-edytorze), to jest to coś, o czym myślę.

numery z tablicy ASCII, tak? A jeśli użytkownik wprowadzi w nazwisku polski znak? Da się do tego zaprogramować ASCII by podkładał odpowiedni numer?

Widzę, że wypisujesz do pliku hardkodowany napis ("imię i nazwisko") i tekst podany przez użytkownika. W którym tekście polskie znaki są źle wypisane?

W każdym z przypadków są źle wypisane, jedynie podczas wprowadzania przez użytkownika polskiego znaku to niby dobrze została wartość wysłana to później wyświetla ją program błędnie i w pliku.txt i w konsoli

Nie rozumiem tego podpunktu, notatnik raczej dobrze odczytuje kodowanie(na 90%)

Zrób taki test i zobacz, czy w pliku pojawi się znak ą, najlepiej pokaż zawartość pliku w hex-edytorze.

    char test[30];
    test[0] = 'a';
    test[1] = ' ';
    test[2] = 'ą';
    test[3] = ' ';
    test[4] = 'a';
    test[5] = ' ';
    test[6] = 0xB9; // znak ą w kodowaniu Windows 1250
    test[7] = ' ';
    test[8] = 'a';
    test[9] = ' ';
    test[10] = 0xC4; // znak ą w kodowaniu UTF 8
    test[11] = 0x85;
    test[12] = ' ';
    test[13] = 'a';
    test[14] = 0;
    printf("a ą a \xB9 a \xC4\x85 a | %s", test);
    fprintf(plik, "a ą a \xB9 a \xC4\x85 a | %s", test);
    fclose(plik);

Nie za bardzo ogarniam sprawę z hex editorem. W konsoli nie wyświetla się "ą"

numery z tablicy ASCII, tak? A jeśli użytkownik wprowadzi w nazwisku polski znak? Da się do tego zaprogramować ASCII by podkładał odpowiedni numer?

Nie chodzi tu o jakąkolwiek konwersję, tylko o to, żeby kod źródłowy nie zawierał polskich znaków. Ale i tak rozumiem, że wykluczyłeś sposób kodowania pliku z źródłem jako możliwą przyczynę problemu.

0

Nie za bardzo ogarniam sprawę z hex editorem. W konsoli nie wyświetla się "ą"

Na przykład https://mh-nexus.de/en/hxd/ . Chodzi o wyświetlenie pliku w postaci liczb reprezentujących wartości kolejnych bajtów. Te liczby to będzie jednoznaczna informacja, co program tak naprawdę zapisał.

Albo też możesz w swoim programie dopisać kod, który otwiera ten plik jako binarny do odczytu i zaczytuje cały plik do tablicy elementów unsigned char , a na koniec wypisuje wartości elementów tablicy w postaci wartości liczbowych. Będzie właściwie to samo, czyli informacja, jakie bajty zostały faktycznie wygenerowane.

1 użytkowników online, w tym zalogowanych: 0, gości: 1