polskie i norweskie znaki w programie

0

Witam forumowiczów.
Właśnie oswajam się z c++ pisząc swój pierwszy program i oto pojawiają się pierwsze problemy. Program to słownik - przechowuje klasy reprezentujące norweskie części mowy oraz polskie słowa. Ogólnie wszystko póki co działa - tylko mam problem z norweskimi znakami (å Å ø Ø æ Æ). Norweskie słowa bez tych znaków oraz polskie słowa z polskimi znakami mogę przechowywać w stringach. Problem pojawia się gdy w kodzie próbuje umieścić jakiś wyraz zawierający ów norweski znak. Kompilator (VS2010) zgłasza błąd, że znak nie może być reprezentowany w aktualnym kodowaniu 1250.

  1. Jak poradzić sobie z tym problemem przy założeniu, że chce aby słownik był przenośny (jak się uda planuje zrobić wersje mobilną w niedalekiej przyszłości).
  2. Czy istnieje w ogóle możliwość obsługi norweskich znaków z wiersza poleceń (wprowadzanie i wypisywanie)
  3. Tak sobie wymyśliłem, że słowa Norweskie ze słowami polskimi będą powiązane kluczami (każde wystąpienie ma swój unikatowy klucz oraz klucze tłumaczeń) - w jaki sposób najlepiej takie klucze reprezentować? Póki co każdy obiekt ma swój własny klucz w postaci liczby int oraz strukturę z kluczy tłumaczeń. I mam jakieś takie przeczycie, że można to jakoś zoptymalizować pod względem użycia pamięci.
    Trochę wstyd, ze mój pierwszy post to same pytania i prośby o pomoc, proszę o wyrozumiałość i z góry dziękuje za pomoc. Pozdrawiam.
1

Używaj typów unikodowych, czyli wstring zamiast string i wchar_t zamiast char (odpowiednio też wchar_t* zamiast char*)

Literały znakowe trzeba podawać z przedrostkiem L, np.

wchar_t c = L'å';
wstring s = L"żółć";

sam plik źródłowy (.h, .cpp) zapisz jako UTF-8. Tutaj jest instrukcja gdzie to ustawić.

Nie napisałeś jak to chcesz wyświetlać. Jeśli piszesz program konsolowy, to trzeba podjąć dodatkowe kroki, by tekst prawidłowo wyświetlało i wczytywało. Pytaj jakby co.

0

Dziękuje za odpowiedź - jak napisałeś tak zrobiłem. Mogę teraz przechowywać norweskie i polskie znaki w plikach. Słownik aktualnie obsługiwany jest przez konsolowe UI - później zamierzam wziąć się za Qt i stworzyć coś pod Windowsa/Androida. Do obsługi obiektów w konsoli używam teraz wcout oraz wcin. Ustawiłem też obsługę wejścia i wyjścia konsolowego na CP UTF-8 oraz ustawienia lokalne na norweskie:

#include <clocale>
#include <Windows.h>
int main()
{
	setlocale(LC_ALL, "norwegian");
	SetConsoleCP(65001);
	SetConsoleOutputCP(65001);
.
.
.
}
 

Efekt moich działań jest taki że jestem w stanie wyświetlać bezproblemowo norweskie znaki. Do wyświetlania polskich i norweskich znaków jednocześnie zmieniam ustawienia lokalne w zależności od typu obiektu. Tutaj wszystko działa cacy.
Mam problem natomiast z wprowadzaniem znaków polskich i norweskich Po sprawdzeniu stanu strumienia otrzymuje jednocześnie failbit oraz eof. Stąd moje pytania Czy źle kombinuje? I dlaczego failbit oraz eof jednocześnie? (za pomocą wcin próbuje wprowadzić pojedynczą zmienną wchar_t).

0

Udało się, satysfakcja z rozwiązania problemu nieopisana:) Podzielę się - może się komuś kiedyś przyda. Program odczytuje do wstring znaki wszelakie tylko do prawidłowego wyświetlania trzeba zmienić ustawienia regionalne(jeśli w ogóle istnieje taka potrzeba). Można też analogicznie wyświetlać dane z buffera za pomocą WriteConsole.

 
#include <Windows.h>
#include "string"
#include "clocale"

int main()
{
	SetConsoleCP(65001);
	SetConsoleOutputCP(65001);
	setlocale(LC_ALL, "norwegian"); // dla wyświetlania nor znaków
	
	std::wstring word_data =  L"høy";
	DWORD read, wrote;
	wchar_t* buffer = new wchar_t[20];

	while(ReadConsole(GetStdHandle(STD_INPUT_HANDLE), buffer, 20, &read, 0))
	{
		std::wstring input(buffer,read - 2);
		if(word_data == input)
			std::cout << "Znalazłem!!\n";
	}
delete [] buffer;
}

Dzięki za pomoc i nakierowanie myśli na właściwy tor.

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