• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Kodowanie ASCII polskich znaków - LINUX

VPS Starter Arubacloud
0 głosów
3,368 wizyt
pytanie zadane 20 października 2015 w C i C++ przez baszmest Gaduła (3,080 p.)
zamknięte 20 października 2015 przez baszmest

Witam, piszę program w C na LINUX-a, który ma zliczać ilość polskich znaków w pliku lub ze standardowego strumienia wejścia.

Wiem, jak wykonać program dla "normalnych" znaków(na linuxie i windowsie) oraz dla polskich, ale tylko dla Windows. Nie wiem jednak jakie jest kodowanie ąęśćźżół w Linux.

Gdy piszę np. coś takiego:

if ( c == 'ą' )

kompilator wypisuje coś w rodzaju, że 'ą' składa się z 2 elementów.... Spróbowałbym kodem zamiast symbolu, ale jaki kod ? Coś z tej tabeli: https://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C3%B3w ?

Zasadnicze pytanie: Jak zatem rozpoznawać polskie znaki na LINUXIE pisząc w C ?

Jest to program na zajecia z programowania, a wykladowca używa chyba Linuxa.... :)

komentarz zamknięcia: Powiedzmy, że znalazłem rozwiązanie :)

3 odpowiedzi

+1 głos
odpowiedź 20 października 2015 przez niezalogowany
wybrane 20 października 2015 przez baszmest
 
Najlepsza
Nie powinieneś porównywać do znaku "ą"

Powinieneś odczytać kod ascii i porównać do kodu ascii

Powinieneś poczytać o unicode (kodowanie znaków) w linuxach utf-8 ustawiony jest przeważnie domyślnie

EDIT:

Oto tablica: https://pl.wikisource.org/wiki/Unicode/Lista_znak%C3%B3w
komentarz 20 października 2015 przez niezalogowany
edycja 20 października 2015

bo utf jest podzbiorem unikodu a unikod to standard

EDIT

UTF-8: szesnastkowo 0xC485 czyli dziesiętnie 50309

Czytam i nie wiem o co chodzi możesz to objaśnić i podać jakieś przykłady (nie jestem w stanie tego pojąć)

komentarz 20 października 2015 przez furas Maniak (53,800 p.)
edycja 20 października 2015 przez furas

UNICODE to numeracja znaków kolejnymi numerami. 

Można każdy znak zapisywać jako 4 bajty i dla wszystkich starczy numerów. Ale wiele nie potrzebuje aż 4 bajtów do zapisu więc zastosowano kompresję - kodowanie np. UTF8. Tylko powstał problem jak potem rozpoznać czy skompresowany znak zajmuje 1, 2, 3 lub 4 bajty - dlatego trzeba było jakoś je oznakować. Dlatego na początku kodu  znaku (po obcięciu zbędnych zer) dodano bity 0 lub 110 lub 1110, itd. ale przez takie dodanie bitów wartośc 0x105 zmienia się w wartość 0xc485. Można ją jednak teraz spokojnie zapisać na dwóch bajtach bo początkowe bity pierwszego bajtu dają informację, że trzeba doczytać drugi bajt aby mieć pełny kod w zapisie UTF8. 

Przy tym dodawaniu bitów wykonuje się więcej działań co jest pokazane w wikipedii:

https://pl.wikipedia.org/wiki/UTF-8

komentarz 20 października 2015 przez niezalogowany
Czyli aplikacje pisane w c gdzie użytko kodu dziesiętnego 261 nie będą działać ?

w cpp z tego co pamiętam używałem właśnie takich kodów i działały (w c nie sprawdzałem)
komentarz 20 października 2015 przez furas Maniak (53,800 p.)
W C++ kilka rzeczy dodali aby łatwiej się pracowało ale nie wiem czy jest obsługa UNICODE - nie sprawdzałem tego bo nigdy nie używałem polskich liter.  

`char` pozwala przechowywać wartości od 0 do 255 więc wartość 261 tam się nie zmieści i odczyt do `char` tu się nie nadaje.

Gdyby system był skonfigurowany na UTF-32 to wtedy chyba każdy znak zajmował by 4 bajty (i nie wymagal kompresji oraz dodawnia początkowych bitów) czyli zajmował by tyle co `int` więc może w ten sposób dało by się jakoś odczytac od razu wartość 261. A może jest to zależne od systemu operacyjnego - w jednym mogą być przygotowane biblioteki i wystarczy tylko dodać plik nagłowkowy a w innych trzeba zewnętrznych bibliotek.

Nie wgryzałem się w temat.
komentarz 20 października 2015 przez niezalogowany
Podobnie jak ja :)
0 głosów
odpowiedź 20 października 2015 przez furas Maniak (53,800 p.)
W Linux można ustawić dowolne kodowanie ale przeważnie jest to UTF-8 gdzie polskie znaki składają się z dwóch bajtów a `char` to jeden bajt. Znaki innych narodów moga zajmować nawet do 4 bajtów. Standardowo C nie ma nic do obsługi takiego kodowania. Nie przeszkadza to przy wyświetlaniu polskiego teksty ale jest problem przy porównywaniu czy nawet przy liczeniu ilości znaków w tekście.
0 głosów
odpowiedź 20 października 2015 przez baszmest Gaduła (3,080 p.)

Ok, myślę, ze rozwiązałem problem.

Przykładowo, chcąc liczyć illość wystąpień Ą taki zapis mi działa bez problemu

while((c = fgetc(in) != EOF)
if ( c == 0x84 ) counter++;

Także, dzięki za pomoc :)

komentarz 20 października 2015 przez furas Maniak (53,800 p.)

To teraz spróbuj policzyć ilość wszystkich wpisanych liter ;)

 

while((c = fgetc(in) != EOF) counter++;

 

Podobne pytania

0 głosów
0 odpowiedzi 416 wizyt
+2 głosów
1 odpowiedź 591 wizyt
pytanie zadane 7 października 2021 w HTML i CSS przez Dzango111 Użytkownik (660 p.)
0 głosów
1 odpowiedź 1,505 wizyt

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...