/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
CharToOem() og om danske tegn
Fra : Morten


Dato : 23-11-01 16:44

Jeg har læst et sted i denne gruppe, at funktionen CharToOem() kan bruges
til at konvertere mellem Windows's - og dos's tegnsæt. Er der nogen, der kan
fortælle mig, hvordan man rent praktisk anvender denne funktion?
Problemet er nemlig at de danske tegn (æ, ø og å) vises korrekt (f.esk. i
forbindelse med en printf() sætning) når de skrives ind i Visual C++´s
editor, men ikke når programmet køres. Der er tale om et consol program og
jeg anvender en Windows baseret Visual C++.

Jeg ved, at man kan:
1) Skrive programmet i en DOS editor som, f.x. edit og derefter compile det
i Visual C++ e.lig. Det har dog den bivirkning, at de danske tegn bliver
ulæselige.
2) Angive de hexadecimale værdier i strengen i stdet for æ, ø, og å, som
f.x.
printf("Vi skal v""\x91""re s""\x9B""de ved hinanden."); /* 91h="æ" | 9Bh=ø
| 86h=å */

Jeg kunne også godt tænke mig, at høre fra andre, som har/haft de samme
problem, og om der evt. kunne være andre og måske næmmere måder til at løse
dette problem.

På forhånd tak.
Mvh. Morten
mozart@mobilixnet.dk

 
 
Ivan Johansen (24-11-2001)
Kommentar
Fra : Ivan Johansen


Dato : 24-11-01 00:18

Morten wrote:

> Jeg har læst et sted i denne gruppe, at funktionen CharToOem() kan bruges
> til at konvertere mellem Windows's - og dos's tegnsæt. Er der nogen, der kan
> fortælle mig, hvordan man rent praktisk anvender denne funktion?


Ifølge Windows SDK kan den bruges således:
char Str[] = "Vi skal være søde ved hinanden.";
CharToOem(Str, Str);
printf(Str);

Her anvendes Str både som source og destination. Jeg håber at du kan
bruge det.

Ivan Johansen


Morten (24-11-2001)
Kommentar
Fra : Morten


Dato : 24-11-01 11:49

Ivan Johansen <NG@Padowan.dk> wrote in message news:<3BFED918.1040703@Padowan.dk>...
> Morten wrote:
>
> > Jeg har læst et sted i denne gruppe, at funktionen CharToOem() kan bruges
> > til at konvertere mellem Windows's - og dos's tegnsæt. Er der nogen, der kan
> > fortælle mig, hvordan man rent praktisk anvender denne funktion?
>
>
> Ifølge Windows SDK kan den bruges således:
> char Str[] = "Vi skal være søde ved hinanden.";
> CharToOem(Str, Str);
> printf(Str);

Men hvad gør man så, hvis der skal skrives flere sætninger? Man kan
jo ikke definere Str igen. M.a.o. hvordan ændre jeg Str[] til en anden
streng? For det ville jo være noget upraktisk, hvis man til hver ny
sætning skulle definere en ny streng (str2[] str3[] o.s.v.).
Det ville også være smart, hvis de tre ovemstående sætninger kunne
laves til en funktion med tekst strengen til parameter. Er det mulig?
>
> Her anvendes Str både som source og destination. Jeg håber at du kan
> bruge det.
>
> Ivan Johansen

Ivan Johansen (24-11-2001)
Kommentar
Fra : Ivan Johansen


Dato : 24-11-01 19:11

Morten wrote:

>>Ifølge Windows SDK kan den bruges således:
>>char Str[] = "Vi skal være søde ved hinanden.";
>>CharToOem(Str, Str);
>>printf(Str);
> Men hvad gør man så, hvis der skal skrives flere sætninger? Man kan
> jo ikke definere Str igen. M.a.o. hvordan ændre jeg Str[] til en anden
> streng? For det ville jo være noget upraktisk, hvis man til hver ny
> sætning skulle definere en ny streng (str2[] str3[] o.s.v.).
> Det ville også være smart, hvis de tre ovemstående sætninger kunne
> laves til en funktion med tekst strengen til parameter. Er det mulig?

Udemærket ide, lad os prøve at lave en funktion. Mon ikke følgende kan
bruges:

std::string Ansi2Oem(const std::string &Str)
{
char *Temp = new char[Str.size()+1];
CharToOem(Str.c_str(), Temp);
std::string RetStr(Temp);
delete[] Temp;
return RetStr;
}

Denne funktion kan nu bruges således:
printf(Ansi2Oem("Vi skal være søde ved hinanden.").c_str());

Hvis du i stedet bruger cout, hvilket er det normale i C++, gøres det
således:
std::cout << Ansi2Oem("Vi skal være søde ved hinanden.");

Jeg håber at det hjælper dig.

Ivan Johansen



Morten (25-11-2001)
Kommentar
Fra : Morten


Dato : 25-11-01 01:16

"Ivan Johansen" <NG@Padowan.dk> skrev i en meddelelse
news:3BFFE2CA.5070405@Padowan.dk...
> Morten wrote:
>
> >>Ifølge Windows SDK kan den bruges således:
> >>char Str[] = "Vi skal være søde ved hinanden.";
> >>CharToOem(Str, Str);
> >>printf(Str);
> > Det ville også være smart, hvis de tre ovemstående sætninger kunne
> > laves til en funktion med tekst strengen til parameter. Er det mulig?
>
> Udemærket ide, lad os prøve at lave en funktion. Mon ikke følgende kan
> bruges:
>
> std::string Ansi2Oem(const std::string &Str)
> {
> char *Temp = new char[Str.size()+1];
> CharToOem(Str.c_str(), Temp);
> std::string RetStr(Temp);
> delete[] Temp;
> return RetStr;
> }
Tak for det gode foreslag, men vil du ikke godt prøve, at skrive ovenstående
funktion i ren C?

> Jeg håber at det hjælper dig.
>
> Ivan Johansen
>
>

Ivan Johansen (25-11-2001)
Kommentar
Fra : Ivan Johansen


Dato : 25-11-01 11:12

Morten wrote:

>>std::string Ansi2Oem(const std::string &Str)
>>{
>> char *Temp = new char[Str.size()+1];
>> CharToOem(Str.c_str(), Temp);
>> std::string RetStr(Temp);
>> delete[] Temp;
>> return RetStr;
>>}
>>
> Tak for det gode foreslag, men vil du ikke godt prøve, at skrive ovenstående
> funktion i ren C?


Til brug i ren C har du allerede CharToOem(). Du kan selvfølgelig også
prøve følgende:
const char* Ansi2Oem(const char *Str)
{
static char Buffer[100];
CharToOem(Str, Buffer);
return Buffer;
}

Her har du dog en begrænsning på antallet af tegn du må angive som
parameter (Her sat til 100). Desuden vil Buffer blive overskrevet ved
hvert kald. Den første funktion er derfor at foretrække, men du er
velkommen til at bruge ovenstående hvis du bedre kan lide den.

Ivan Johansen



Morten (25-11-2001)
Kommentar
Fra : Morten


Dato : 25-11-01 20:36

Ivan Johansen <NG@Padowan.dk> wrote in message news:<3C00C40A.5080707@Padowan.dk>...
> Morten wrote:
> Til brug i ren C har du allerede CharToOem(). Du kan selvfølgelig også
> prøve følgende:
> const char* Ansi2Oem(const char *Str)
> {
> static char Buffer[100];
> CharToOem(Str, Buffer);
> return Buffer;
> }
>
> Her har du dog en begrænsning på antallet af tegn du må angive som
> parameter (Her sat til 100). Desuden vil Buffer blive overskrevet ved
> hvert kald. Den første funktion er derfor at foretrække, men du er
> velkommen til at bruge ovenstående hvis du bedre kan lide den.
>
> Ivan Johansen

Takker mange gange for dine foreslag.
Hilsen Morten

Søg
Reklame
Statistik
Spørgsmål : 177500
Tips : 31968
Nyheder : 719565
Indlæg : 6408518
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste