Trädvy Permalänk
Medlem
Plats
Earth
Registrerad
Apr 2004

hur får jag å,ä,ö i C++?

när jag skriver ut med 'cout <<' och använder å,ä eller ö i orden så syns inte det. hur kan jag göra då? är totalt nybörjare med C++, startade o testade lite idag

1 >> Intel i5-2500K | GA-P67A-UD5-B | Asus GTX 570 | G.SKILL 16Gb | Windows 7 pro | p183 v3 | LG L226WU-PF
2 >> AMD 64 x2 6400+ | Asus Crosshair | 8800GT 512Mb | Mushkin 4Gb | Vista 64 <> XP 32 | p182 | LG L226WU-PF
2 >> Fujitsu Lifebook | Intel i5-2450M | 4Gb | 300GB HD | GT 525M | Windows 7 pro

Trädvy Permalänk
Medlem
Plats
Västerås
Registrerad
Okt 2004

Du måste använda escape-sekvenser:
\x86 = å
\x84 = ä
\x94 = ö

Ex: #include <iostream> using namespace std; int main() { cout << "Rolf Gunnarsson" << endl << "Lingplockarstigen. 13" << endl << "723 51 V\x84ster\x86s" << endl; return 0; }

Trädvy Permalänk
Medlem
Plats
Earth
Registrerad
Apr 2004

ah, ok. tack

1 >> Intel i5-2500K | GA-P67A-UD5-B | Asus GTX 570 | G.SKILL 16Gb | Windows 7 pro | p183 v3 | LG L226WU-PF
2 >> AMD 64 x2 6400+ | Asus Crosshair | 8800GT 512Mb | Mushkin 4Gb | Vista 64 <> XP 32 | p182 | LG L226WU-PF
2 >> Fujitsu Lifebook | Intel i5-2450M | 4Gb | 300GB HD | GT 525M | Windows 7 pro

Trädvy Permalänk
Medlem
Plats
::1
Registrerad
Aug 2004

Är det inte så att det är cmd i windows som är trasig? För mig funkar det utmärkt med bash.

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Dec 2002

masv: Jo så är det, CMD i Windows klarar inte av ÅÄÖ, samtliga terminaler som jag vet om i Linux fungerar utmärkt med åäö i koden.

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Trädvy Permalänk
Medlem
Registrerad
Maj 2003

Denna fråga borde kanske läggas till i FAQ?

Jag vet tyvärr ingen snygg lösning på detta problem som fungerar överallt. Visserligen kan man använda alternativa konsoller i Windows som t ex bash, men då måste ju också alla andra personer som man vill ska kunna köra programmet ha det.

Här är en liten sammanfattning jag skrev ihop:

Anledningen till att åäöÅÄÖ (och alla andra "udda" tecken som é, ü, osv) inte ser rätt ut i konsollen, beror på att den som standard är satt till OEM-850 medans allt annat kör Windows-1252 (Latin I). Dessa är inte helt kompatibla då vissa tecken har helt olika koder.

Det finns två sätt att lösa det på, fixa koden eller fixa konsollen.

Lösning 1: (Fixa koden)

Byt ut alla tecken (alternativt använda t ex UltraEdit och köra ANSI-to-OEM):

å = \x86
ä = \x84
ö = \x94
Å = \x8F
Ä = \x8E
Ö = \x99

T ex:
printf("\x86\x84\x94\x8F\x8E\x99\n"); // skriver ut åäöÅÄÖ

Men det är inte alltid detta fungerar så bra; för om man t ex sparar text till en fil och öppnar den med notepad, så ser alla åäöÅÄÖ ut som †„”Ž™. Det går dock att fixa genom att sätta fonten till Terminal.
Knivigare blir det om det är andra (Windows-)program som ska öppna filen, t ex om det är en lista över filer (som en m3u-playlist).

Lösning 2: (Fixa konsollen)

Högerklicka på titelraden för konsollfönstret, välj Properties/Egenskaper.
Gå till Font, sätt den till "Lucida Console", tryck OK och välj att det ska gälla alla fönster.

Lösning 2a: (Fungerar endast i WinNT/2K/XP)
Lägg till i din kod:
#include <windows.h>

och lägg till detta i början av main:
SetConsoleOutputCP(1252);

Lösning 2b:
Skriv i konsollen: (detta måste göras varje gång du startar en ny konsoll, men det går att lösa genom att skapa en genväg till "cmd.exe /c chcp 1252")

Om du kör WinNT/2K/XP:
chcp 1252

Om du kör Win9X:
mode con cp select=1252

Dock så fungerar varken 2a eller 2b särskilt bra om man inte har satt fonten till Lucida Console.

Trädvy Permalänk
Medlem
Plats
Earth
Registrerad
Apr 2004

trodde inte det va så komplicerat.. får väl skriva på engelska kanske istället.

1 >> Intel i5-2500K | GA-P67A-UD5-B | Asus GTX 570 | G.SKILL 16Gb | Windows 7 pro | p183 v3 | LG L226WU-PF
2 >> AMD 64 x2 6400+ | Asus Crosshair | 8800GT 512Mb | Mushkin 4Gb | Vista 64 <> XP 32 | p182 | LG L226WU-PF
2 >> Fujitsu Lifebook | Intel i5-2450M | 4Gb | 300GB HD | GT 525M | Windows 7 pro

Trädvy Permalänk
Medlem
Plats
Härnösand
Registrerad
Apr 2003

finns ett program som fixar till det annars..

K4 Jägare är härliga människor. Varför får inte rika människor bli rikare. Ja till EMU
We live for the one, we die for the one'
(Loggar man inte ut får man en extra rad i sin signatur :-) /VaCUm)

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Okt 2001
Citat:

Ursprungligen inskrivet av Lady
finns ett program som fixar till det annars..

Vi skall gissa oss fram till vad det heter, eller?

Trädvy Permalänk
Medlem
Registrerad
Mar 2004

japp åäö programet sök på google!

Trädvy Permalänk
Medlem
Plats
Borås
Registrerad
Maj 2004

Madah: mycket bra sammanfattning
Har du pratat/skrivit till en moderator så att det kan läggas till i FAQ

Trädvy Permalänk
Hedersmedlem
Plats
Stockholm
Registrerad
Dec 2002

madah: Skicka det till Kennel så slänger han in det i FAQ om han tycker att det är nödvändigt och bra skrivet.

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Trädvy Permalänk
Medlem
Registrerad
Sep 2006

Jag brukar köra iodos.h. Kommer inte ihåg hur jag fick tag i den ifrån början men.

http://www.cs.chalmers.se/~skanshol/cpp_dir/exempel/iodos.h

COBHC

Trädvy Permalänk
Medlem
Plats
duktig vovve.
Registrerad
Jan 2010

#include <iostream> #include <clocale> int main() { setlocale(LC_ALL, "swedish"); cout << "å, ä, ö"; }

(klarar dock ej inmatning, endast cout)

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Apr 2013

Jag är hemskt ledsen att väcka denna 3 år gamla tråd,
men denna tråd är den första som dyker upp på Google
och jag måste dela med mig av denna information.

För att lättast få ÅÄÖ att fungera i kosnolen på Windows i Visual Studio.

Spara din .cpp-fil med en annan kodning, detta gör du genom att:
File > Save *.cpp As... > tryck på pilen på Save och väl Save with Encoding... > Ja, ersätt filen > Scrolla längst ned på Encodng, där du finner Western European (DOS) - Codepage 850.

Detta fungerar för mig, och kan tyvärr inte testa det på fler datorer.

Och igen ursäktar jag mig för att bumpa en 3 år gammal tråd,
men finner det mycket nödvändigt.

Trädvy Permalänk
Medlem
Registrerad
Jan 2013

enklaste lösningen:

setlocale(LC_ALL," ");

klart

Trädvy Permalänk
Medlem
Plats
Sundsvall
Registrerad
Mar 2012
Skrivet av Liggliluff:

Jag är hemskt ledsen att väcka denna 3 år gamla tråd,
men denna tråd är den första som dyker upp på Google
och jag måste dela med mig av denna information.

För att lättast få ÅÄÖ att fungera i kosnolen på Windows i Visual Studio.

Spara din .cpp-fil med en annan kodning, detta gör du genom att:
File > Save *.cpp As... > tryck på pilen på Save och väl Save with Encoding... > Ja, ersätt filen > Scrolla längst ned på Encodng, där du finner Western European (DOS) - Codepage 850.

Detta fungerar för mig, och kan tyvärr inte testa det på fler datorer.

Och igen ursäktar jag mig för att bumpa en 3 år gammal tråd,
men finner det mycket nödvändigt.

setlocale(LC_ALL," ") fungerar finfint för mig iaf, som ovanstående skrev.

Spela World of Tanks med oss på SweClockers.com!
Vi har en inofficiell klan där alla som gillar att vara social och spela tanks får vara med!
SweC - World of Tanks clan
Välkommen!

Trädvy Permalänk
Medlem
Plats
Uppsala
Registrerad
Jul 2011

För Windows:
1) Sätt konsollen till Unicode-kapabel font.
2) Öppna med följande:

_setmode(_fileno(stdout), _O_U16TEXT)

eller vad för ström du nu vill skriva till. _setmode finns i io.h och _O_U16TEXT i fcntl.h (men du kan definiera den till 0x20000 så slipper du en header).
3) Använd strängar och strängfunktioner av wide-varianten (wcout, wstring, ...).

#include <io.h> #include <iostream> #include <string> #define _O_U16TEXT 0x20000 using namespace std; int main(char16_t* argv[], int argc) { _setmode(_fileno(stdout), _O_U16TEXT); wstring hallå = L"hallåååå"; wcout << hallå << endl; return 0; }

.<

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2011

som redan nämnts lägg in setlocale(LC_ALL," ") i main.

[i7 7700K] [GTX 980] [Corsair CX 1000W] [ASUS MARK II] [32GB 3000Mhz Corsair] [Samsung EVO 850 500GB]

Trädvy Permalänk
Medlem
Plats
Mariestad
Registrerad
Okt 2011

Den här tråden tål kanske att bumpas upp lite eftersom jag har funnit en lösning som tar både cout och cin (med t ex svenska tecken).

Det handlar i korthet om att lägga till en headerfil till sitt projekt. Enklast är nog att lägga den i projektmappen tillsammans med t ex main.cpp. Jag provade först med Jan Skansholms iodos.h men eftersom jag fick en varning i kompileringen (med gcc i CodeBlocks) så sökte jag vidare och fann en förbättrad variant (iodos_fix_gcc.h) från Lunds Universitet som fungerar kanon, och alltså både för in- och utmatning av svenska tecken.

Tillämpning:

  • Lägg filen (iodos.h eller iodos_fix_gcc.h) i din projektmapp.

  • Inkludera den i main.cpp med #include "iodos_fix_gcc.h" (i mitt fall).

  • Skriv dos_console(); som första rad i main-funktionen.

Jag skulle förmoda att originalet (iodos.h) fungerar bra i t ex Dev-C++ och Visual C++, men i mitt fall (CodeBlocks och kompilering med gcc) fungerar den modifierade bäst/utmärkt.

Hope this helps!
Och sprid gärna detta vidare (ifall ni vill eller det kanske behövs).

PS: Först fick jag information om att man skulle skria dos_console(850); först i main-funktionen, men efter att ha läst kommentaren i Skanstulls fil håller jag mig till bara dos_concole(); istället.
PPS: Jag är totalt n00b när det gäller programmering och håller på att försöka lära mig. Men det har stört mig något alldeles oerhört att jag inte har kunnat använda svenska tecken.. förrän nu.

Intel Core i5 6600K / Asus Z170 Pro Gaming / 2 x 8GB Kingston HyperX Fury DDR4 / Radeon R7 250 / WD 500 GB m. Win10pro + Samsung 1 TB