Polskie znaki

0

Mam problem odnośnie polskich znaków.

               std::wstring tem;
                std::wstring tekst;
        std::wstring wzorzec;
        std::wstring nazwapliku;
        std::wcin >> nazwapliku;
        std::getline(std::wcin, tempppp);
        std::getline(std::wcin, wzorzec);

        std::wcout << "wzorzec:" << wzorzec << std::endl;

        std::wfstream plik;
        plik.open(nazwapliku, std::ios::in);
                if (plik.good() == true)
                {

        std::getline(plik, tekst);
        std::wcout << "tekstt:" << tekst << std::endl;
                              }

program uruchamiam poprzez plik z komendą KR.exe < input.in > output.out
w input.in znajduje się nazwa pliku z którego tekst ma być pobrany oraz wzorzec

program pobiera tyle znaków jaka jest długość wzorca.

plik wyjściowy jaki dostaje:

1

2

Jak widać na zdjęciu zawsze obojętnie jaki przykład daje na początku daje jakieś 3 linie ze znakami i zawsze przy polskim znaku daje dodatkową linie Przez to wynik wychodzi mi nie poprawny.
Używam jak widać wstringa wcin itd ale nic to nie daje. W czym może być problem

0

Nie wiem, czy to dobry trop, ale np. 0xc4 0x99 to litera ę zakodowana w UTF-8. Może plik masz UTF-8, a konsumujesz np. jako Windows 1250.

0

Ale zobacz, że na1 zdjęciu 11,14,17 linia nie jest kolejnymi literami tylko czymś innym i to co powinno być na 11 jest na 12 itp

1

Niewiele więcej da się dojrzeć, bo nie wiadomo skąd pochodzą wiersze pat:. Przyszło mi tylko do głowy, że być może tniesz sekwencje UTF-8 w środku znaków.

0

biorę od początku tyle liter z tekstu jaka jest długość wzorca i przekazuje do funkcji która coś robi i tam po prostu dałem std::wcout<<"pat: "<<teskt; gdzie tekst to te przekazane znaki

ogólnie nie muszę tego wyświetlać więć krzaki mogą tam byc tylko że ja muszę odnaleść na której pozycji znajduje się dany wzorzec a przez to że pojawiają się jakieś losowe linie wszystko przesuwa się do przodu i wyniki wychodzą źle. na pierwszym zdjęciu widać 0 3 6 9 a powinno byc 0 2 4 6

0

Moim zdaniem to nadal problem z kodowaniem znaków. Jeśli pracujesz z Windows to obsługa UTF-8, to nie jest takie hop-siup.
Reading UTF-8 with C++ streams
Upgrading an STL-based application to use Unicode

Nawet jeśli uporasz się z wczytywaniem UTF-8 do UTF-16, to nadal jednego znaku nie możesz brać jako jeden element tablicy, bo np. znak 🔒 ma kod 0x1F512 i zajmuje dwie pozycje UTF-16.

Osobiście pozostałbym przy UTF-8 wczytywanym do tablicy char, a do wyznaczania granic znaków użyłbym CharNextExA, albo własnego kodu bazującego na dwóch najstarszych bitach znaku.

UTF8-CPP: UTF-8 with C++ in a Portable Way

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