Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C++: Ääkköset Windowsin komentorivillä

Brebl [06.04.2019 10:26:07]

#

Muutama yksinkertainen funktio, joilla saa muutettua string merkkijonoa siten, että ääkköset näkyy komentorivillä oikein ja näppäimistösyötteeltä otetut ääkköset saa näkymään muualla Windowsissa oikein.

Oletuksena tässä, että tekstieditori käyttää windows-1252 merkistökoodausta.

Tulostus näytölle:
Merkkijono otetaan funktioon arvoparametrina, koska alkuperäistä merkkijonoa ei haluta muuttaa.
Merkkijono luetaan merkki kerrallaan ja tutkitaan merkin lukuarvo. Tarvittaessa muutetaan toiseen arvoon.
Lopuksi tulostetaan näytölle saatu merkkijono.

void output(std::string teksti) // cout merkistömuunnos 1252 --> 850
	{
		for(auto&& i: teksti){
			if(i == -27) i = -122; // if(i == 'å') i = '†';
			if(i == -28) i = -124; // if(i == 'ä') i = '„';
			if(i == -10) i = -108; // if(i == 'ö') i = '”';
			if(i == -59) i = -113; // if(i == 'Å') i = '';
			if(i == -60) i = -114; // if(i == 'Ä') i = 'Ž';
			if(i == -42) i = -103; // if(i == 'Ö') i = '™';
		}
		std::cout << teksti;
	}

Näppäimistösyötteen lukeminen:
Merkkijonomuuttuja otetaan funktioon viittauksena, jotta sitä voidaan muuttaa.
Kirjoitetaan näppäimistöllä rivi ja tehdään samat temput kuin yllä mutta päinvastoin.

void input(std::string& teksti) // cin merkistömuunnos 850 --> 1252
	{
		std::cin >> std::ws;
		std::getline(std::cin, teksti);
		for(auto&& i: teksti){
			if(i == -122) i = -27; // if(i == '†') i = 'å';
			if(i == -124) i = -28; // if(i == '„') i = 'ä';
			if(i == -108) i = -10; // if(i == '”') i = 'ö';
			if(i == -113) i = -59; // if(i == '') i = 'Å';
			if(i == -114) i = -60; // if(i == 'Ž') i = 'Ä';
			if(i == -103) i = -42; // if(i == '™') i = 'Ö';
		}
	}

Tässä vielä kokonainen esimerkki...

#include <iostream>
#include <string>

void output(std::string);
void input(std::string&);

int main()
{
    std::string t = "åäöÅÄÖ\n";
	output(t);
	output("Syötä uusi teksti ääkkösiä.\n");
	input(t);
	output('\n'+t);
	output("\nLisätty tekstiä alkuun: "+t);
	output("\nIhan toinen teksti\n");
}

void output(std::string teksti) // cout merkistömuunnos 1252 --> 850
{
	for(auto&& i: teksti){
		if(i == -27) i = -122; // if(i == 'å') i = '†';
		if(i == -28) i = -124; // if(i == 'ä') i = '„';
		if(i == -10) i = -108; // if(i == 'ö') i = '”';
		if(i == -59) i = -113; // if(i == 'Å') i = '';
		if(i == -60) i = -114; // if(i == 'Ä') i = 'Ž';
		if(i == -42) i = -103; // if(i == 'Ö') i = '™';
	}
	std::cout << teksti;
}

void input(std::string& teksti) // cin merkistömuunnos 850 --> 1252
{
	std::cin >> std::ws;
	std::getline(std::cin, teksti);
	for(auto&& i: teksti){
		if(i == -122) i = -27; // if(i == '†') i = 'å';
		if(i == -124) i = -28; // if(i == '„') i = 'ä';
		if(i == -108) i = -10; // if(i == '”') i = 'ö';
		if(i == -113) i = -59; // if(i == '') i = 'Å';
		if(i == -114) i = -60; // if(i == 'Ž') i = 'Ä';
		if(i == -103) i = -42; // if(i == '™') i = 'Ö';
	}
}

Grez [06.04.2019 13:23:20]

#

Hieman ihmettelen tällaista vinkkiä tähän maailmanaikaan, kun kaikissa kehitysympäristöissä millä voisi kuvitella Windowsissa ajatteavaa koodia kehitettävän löytyy valmiit rutiinit merkkimuutosten tekemiseen, jolloin muutkin erikoismerkit kuin ääkköset toimii.

Eli periaatteessa ihan jees, kunhan ei kukaan erehdy oikeasti käyttämään missään.

Brebl [06.04.2019 16:04:59]

#

Empä löytänyt code::blocksista moisia rutiineja.
Olen ymmärtänyt että joillakin funktioilla se merkistön mulkkaaminen täytyisi tehdä...

No entäs jotain tämän tapaista?

char buff[sizeof(teksti)];
CharToOemBuff(teksti.c_str(), buff, sizeof(buff));
std::cout << buff;

Metabolix [06.04.2019 17:07:28]

#

Miten olisi oikean koodisivun asettaminen?

#include <windows.h>

// Windows-1252, jos kiinnostaa töhertää vain Windowsilla.
SetConsoleCP(1252);
SetConsoleOutputCP(1252);

// UTF-8, nykyaikaisempi valinta, ja sama ohjelma toimisi sitten Linuxissa.
// Valitettavasti ääkkösten lukeminen Windowsissa ei toimi, tulostus toimii.
SetConsoleCP(65001);
SetConsoleOutputCP(65001);

Jos jostain syystä tämä ratkaisu ei sovi, kannattaisi ainakin hakea oikea koodisivutieto merkkien muuntamista varten, koska eri maissa ei ehkä ole sama merkistö komentorivillä (ja Linux käyttää yleensä UTF-8-koodausta).

Varsinainen "oikea ratkaisu" olisi wchar_t (ja wcout ja wcin), mutta tämänkään käyttö ei ole täysin ongelmatonta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta