Gå til innhold

.no tegn i XPDos


Anbefalte innlegg

jeg starta med C++ for et par måneder siden og det er en ting som har irritert meg siden... Når jeg har kompilert helt enkle executables og kjører de i XPDos, så takler de ikke æ, ø og å.

 

normalt i XPDos på denne maskina så fungerer norske tegn, men ikke når jeg executer de programmene jeg har kompilert selv.(samme skjer på skolen)

 

Opplevde ikke dette problemet under Win2k

Jeg bruker Borland Builder 6.0(og skole-5.0)

Lenke til kommentar
Videoannonse
Annonse

takker for responsen, men i mitt tilfelle funker alt helt fint i DOS helt til jeg kjører noe jeg har laga sjøl i Dos ... kan jo definere ascii verdier etc, men det er altså slik at det funket fint på skolen når de kjørte Win2k.

 

m åvel være noe lurt de hadde gjort under win2k som de ikke har etter de skifta te XP på skolen .... tar en prat med admin der og gir han den "if it ain't broke dont' fix it" leksa :)

Lenke til kommentar

Funksjonen du er ute etter heter CharToOem, og er en funksjon som ligger i user32.lib .

 

Prototypen ser slik ut:


BOOL CharToOem(LPCTSTR lpszSrc, LPSTR lpszDst);

 

Selv bruker jeg noen hjelpefunksjoner jeg har laget:


namespace strext

{

inline const char*

AnsiToOem(char* str_)

{

 ::CharToOemA(str_, str_);

 return str_;

}



template

<

 class Traits, 

 class Allocator

>

inline const std::basic_string<char, Traits, Allocator>&

AnsiToOem(std::basic_string<char, Traits, Allocator>& str_)

{

 ::CharToOemA(str_.c_str(), const_cast<char*>(str_.c_str()) );

 return str_;

}



inline std::string

AnsiToOemCopy(const char* str_)

{

 std::string res(std::char_traits<char>::length(str_), ' ');

 ::CharToOemA(str_, const_cast<char*>(res.c_str()) );

 return res;

}



template

<

 class Traits,

 class Allocator

>

inline std::basic_string<char, Traits, Allocator>

AnsiToOemCopy(const std::basic_string<char, Traits, Allocator>& str_)

{

 std::basic_string<char, Traits, Allocator> res(str_.length(), ' ');

 ::CharToOemA(str_.c_str(), const_cast<char*>(res.c_str()) );

 return res;

}



inline std::string

AnsiToOemCopy(const wchar_t* str_)

{

 std::string res(std::char_traits<wchar_t>::length(str_), ' ');

 ::CharToOemW(str_, const_cast<char*>(res.c_str()) );

 return res;

}



template

<

 class Traits,

 class Allocator

>

inline std::string

AnsiToOemCopy(const std::basic_string<wchar_t, Traits, Allocator>& str_)

{

 std::string res(str_.length(), ' ');

 ::CharToOemW(str_.c_str(), const_cast<char*>(res.c_str()) );

 return res;

}

}

 

AnsiToOem konverterer en streng uten å allokere ekstra minne. Dvs. at den opprinnelige strengen vil bli forandret.

 

AnsiToOemCopy konverterer strengen og returnerer resultatet i en ny streng slik at den opprinnelige strengen ikke blir forandret. Denne funksjonen finnes det en wchar_t versjon av også :)

 

Du kan bruke de slik:


#include <windows>

#include <iostream>

#include <string>



int main()

{

using std::cout;

using std::wcout;

using std::endl;



std::string  str("æ, ø, å, Æ, Ø, Å");

std::wstring	wstr(L"æ, ø, å, Æ, Ø, Å");



cout << "Uten konvertering: n";

cout << str << endl;

wcout << wstr << endl;



cout << "nKonverterte kopier: n";

cout << strext::AnsiToOemCopy(str) << endl;

cout << strext::AnsiToOemCopy(wstr) << endl;



cout << "nKonvertert streng uten ekstra minneallokering: n";

cout << strext::AnsiToOem(str) << endl;

}





Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...