typ char i polskie znaki

Wszystko o naszych nuklejkach od STM
ODPOWIEDZ
michciobb
Nowy
Posty: 4
Rejestracja: 11 sty 2020, 18:29

typ char i polskie znaki

Post autor: michciobb » 11 sty 2020, 18:58

Witam wszystkich uprzejmie.
Od niedawna próbuję przejść z AVR i ARM i pojawiają się dziwne problemy, proszę o pomoc.
Program piszę w STM32CubeIDE na płytkę Nucleo-64 STM32F303

Gdy próbuję zdefiniować tablicę z elementami typu char, która zawiera znaki o kodzie powyżej 127
  1. char pl[] = {'ą','ć','ę','ł','ń','ó','ś','ź','ż','Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż'};
pojawiają mi się takie ostrzeżenia:
  1. warning: large integer implicitly truncated to unsigned type [-Woverflow]
  2. warning: multi-character character constant [-Wmultichar]
W czasie debugowania zauważyłem, że program nie działa prawidłowo, bo dany znak char otrzymuje dziwny kod.

Niestety przez to biblioteka do wyświetlania napisów na LCD nie działa prawidłowo, pomimo, że na AVR działała ładnie. W czym szukać problemu?

Dodano po 21 minutach 36 sekundach:
natomiast taki ciąg znaków:
  1. char str2 [] = {"Zćczynaj..."};
literę 'ć' rozbija na dwa znaki, zobaczcie poniżej
Co z tym zrobić aby poszczególne znaki z str2 prawidłowo porównywały się z poszczególnymi znakami z tablicy pl[]?
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

Awatar użytkownika
SunRiver
Administrator
Posty: 802
Rejestracja: 08 paź 2017, 11:27
Lokalizacja: Opole
Kontakt:

Re: typ char i polskie znaki

Post autor: SunRiver » 11 sty 2020, 20:23

Nie wiem na ile ci to pomoże, ale w sumie nie zastanawiałem się nad problemem
gdyż niejako z automatu , staram się uzywać stringów , wiec polskie znaki są prawidłowo wyświetlane
zaś jak muszę użyć typu char wysyłam kod znaku

np ć = 0x82

ale to tak chyba po bandycku :) a tyle wersji ilu programistów :)
.... z każdym bitem serca ....
💫SunDUINO
💦GitHUB
💦Google Drive
💦Sotton

michciobb
Nowy
Posty: 4
Rejestracja: 11 sty 2020, 18:29

Re: typ char i polskie znaki

Post autor: michciobb » 12 sty 2020, 0:19

Ale czy możemy mówić o zmiennych typu string w ARMach? Pamiętajmy, że ciągle mówimy o języku C. Chyba tu ciągle nie ma obsługi zmiennych typu str?
W jaki sposób definiujesz dwa stringi, które później jesteś w stanie porównać znak po znaku? Komenda sprintf też powoduje u mnie rozbicie litery "ę" na dwa znaki o kodach: 0xc4 i 0x99. Czy może jest jakieś ustawienie kodowania w edytorze ST23CubeIDE?, które źle interpretuje wpisane w tablicy litery?!?

michciobb
Nowy
Posty: 4
Rejestracja: 11 sty 2020, 18:29

Re: typ char i polskie znaki

Post autor: michciobb » 13 sty 2020, 0:03

Dobra chyba znalazłem odpowiedź.
Litera "ć" w kodowaniu CP852 ma wartość 0x86, natomiast ta sama wartość w kodowaniu UTF-8 ma już wartość dwubajtową 0xC487. dlatego kompilator przerabiał literę "ć" na dwa bajty: starszy 0xC4 (dec 196) oraz młodszy bajt 0x87 (dec 135).
Z tym, że sprinf wrzucał do tablicy oba bajty, natomiast definiując element tablicy w sposób char str2[] = {'ć'}; kompilator gubił starszy bajt i brał pod uwagę jedynie młodszy bajt.

Problem rozwiązało dodanie do MCU GCC Compiler komendy: gcc -fexec-charset=CP852

I teraz już prawidłowo wczytuje wartości polskich znaków. oczywiście tablica ma elementy typu char więc literę "ć" zapisuje z wartością 134 - 256 = -122
:D

Awatar użytkownika
Zealota
Użytkownik
Posty: 15
Rejestracja: 18 lis 2017, 17:45
Lokalizacja: Gliwice
Kontakt:

Re: typ char i polskie znaki

Post autor: Zealota » 14 sty 2020, 8:40

Dla zainteresowanych używaniem UTF-8 mam wskazówkę.
Można użyć nieco inaczej zdefiniowanego typu zmiennej tzw. "wchar_t", który pomoże przy dwubajtowych znakach.

Mając odpowiedni typ łatwo już definiować odpowiednie ciągi znakowe:
  1. #include <stddef.h>
  2.  
  3. const wchar_t string[] = L"Ą ś ć ź ń";
Przy deklaracjach istotne jest to "L" na początku stringa.

ODPOWIEDZ