Czy komuś to działa? PL znaki.

0
 #include <iostream>
#include <cstring>

std::string PL(std::string Znak) {
	using namespace std;
	for (int i = 0; i < Znak.length(); i++)
	{
		switch (Znak[i])
		{
		case 'ą':
			Znak[i] = static_cast<char>(165);
			break;

		case 'ć':
			Znak[i] = static_cast<char>(134);
			break;

		case 'ę':
			Znak[i] = static_cast<char>(169);
			break;

		case 'ł':
			Znak[i] = static_cast<char>(136);
			break;

		case 'ń':
			Znak[i] = static_cast<char>(228);
			break;

		case 'ó':
			Znak[i] = static_cast<char>(162);
			break;

		case 'ś':
			Znak[i] = static_cast<char>(152);
			break;

		case 'ź':
			Znak[i] = static_cast<char>(171);
			break;

		case 'ż':
			Znak[i] = static_cast<char>(190);
			break;

		case 'Ą':
			Znak[i] = static_cast<char>(164);
			break;

		case 'Ć':
			Znak[i] = static_cast<char>(143);
			break;

		case 'Ę':
			Znak[i] = static_cast<char>(168);
			break;

		case 'Ł':
			Znak[i] = static_cast<char>(157);
			break;

		case 'Ń':
			Znak[i] = static_cast<char>(227);
			break;

		case 'Ó':
			Znak[i] = static_cast<char>(224);
			break;

		case 'Ś':
			Znak[i] = static_cast<char>(151);
			break;

		case 'Ź':
			Znak[i] = static_cast<char>(141);
			break;

		case 'Ż':
			Znak[i] = static_cast<char>(189);
			break;
		case '°':
			Znak[i] = static_cast<char>(248);
			break;
		}
	}
	return Znak;
}
int main()
{
	int liczba = 5;
	std::cout << PL("Ci​ąg znaków; zmienna: ") << liczba << PL(" końcówka") << endl;

	std::cin.get();
	return 0;
}

Bawię się i testuje różne rzeczy. To znalazłem w internecie, ale sam musiałem dodać kilka rzeczy i nie działa, ktoś wie dlaczego bądź co tutaj jest źle? VS2017.

0

Jaką masz stronę kodową ustawioną w konsoli?

2

Źle tutaj jest prawie wszystko:

  • niepotrzebny nagłówek <cstring>;
  • przesłanie obiektu przez wartość zamiast string& phrase;
  • w std::string nie da się zakodować polskich znaków. To co robisz skutkuje warningami w stylu multi-character character constant [-Wmultichar]. Coś co koduje się na dwóch bajtach próbujesz zakodować na jednym; Kwestia zastosowania odpowiedniego kodowania.
  • niepotrzebny std::cin.get(); na końcu. IDE samo rozwiązuje takie rzeczy. W visualu poprzez CTRL + F5;
  • w tak małym programie using namespace std; można spokojnie dać na początku. BTW dlatego program się nie kompiluje, bo później próbujesz wykonać samo endl.
0

Nie mam pojęcia, nic nie ruszałem więc jest taka jaka się zrobiła przy instalacji VisualStudio. "<<" przy wyświetlaniu mi podkreśla i wyskakuje komunikat, że brakuje gdzieś średnika ale nie mam pojęcia o co już chodzi.

1

Wszystko się rozbija o kodowanie:

  1. Jak twój edytor koduje znaki,
  2. czy kompilator, używa tego samego kodowania znaków do odczytu
  3. Czy twoja aplikacja używa właściwego kodowania takiego jakie ustwiłeś do stringów generowanych przez kompilator (kompilator może mieszać kodowanie, kompilacja w jednym kodowaniu, a generować napisy w innym kodowaniu)
  4. Czy konsola używa tego samego kodowania.

Twój kod ma szanse działać tylko dla kodowania, które jest jedno bajtowe, czyli dla języka polskiego będzie to np Windows-1250.
Dla kodowania UTF-8 (obecnie najpowszechniej używane), polskie znaki składają się z kliku bajtów (tak jak wszystkie znaki z poza zakresu ASCII).

0

Te znaki w case to możesz sobie co najwyżej napisać w komentarzu.
W kodzie powinieneś napisać to hexa - jeśli chcesz mieć pewność.
Najlepiej używaj UTF-8 (Linux) lub UTF-16 (Windows) - i problem z głowy.
Strony kodowe to już raczej DOS-owa przeszłość.

3
  • w std::string nie da się zakodować polskich znaków.

To jest oczywista nieprawda.

#include <string>
#include <iostream>
using namespace std;

int main()
{
        string s = "Zażółć gęślą jaźń.";
	cout << s << endl;
}

p.png

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