c ++ - Passerer Unicode kommandorad argumenter til en konsol app

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at skrive en konsol program, der kan acceptere filnavn argumenter og vil have det til at kunne håndtere Unicode filnavne. Problemet er, at jeg ikke kan finde ud af, hvordan man tester det.


Hvordan kan du overføre Unicode-argumenter til en konsol-app?


Jeg forsøgte at oprette en Unicode-batch-fil, der kalder programmet og passerer nogle Unicode-tegn, men det virker ikke. kommandoprompten kan ikke starte programmet på grund af, at det bliver trukket op på null-tegnene i dets filnavn. Jeg forsøgte at ændre kodesiden til 65001 og Alt-skrive et Unicode-tegn på kommandolinjen, men det fungerede heller ikke.


Nedenfor er et prøveprogram. Jeg forsøger at finde en måde at få følgende output på:


C:> unicodeargtest Foobar
46, 0, 6f, 0






// UnicodeArgTest.cpp
#define UNICODE
#include <tchar.h>
#include <stdio.h>
int wmain (int argc, wchar\_t**argv) {
    printf("\%x, \%x, \%x, \%x
", argv[1][0], argv[1][1], argv[1][2], argv[1][3]);
}

Bedste reference


Træk-og-slip skal gøre tricket. I Explorer skal du trække filen, hvis navn du vil overføre som et argument til testkørslen. (Du kan muligvis først ændre den eksekverbare, så den venter, inden du går ud.)

Andre referencer 1


Åh blør! Det skete igen. Jeg kommer fra en assembler baggrund, så nogle gange kører nogle C + + ting mig op. Én ting, som jeg stadig glemmer, er, hvordan i C ++, kompilatoren har friheden til automatisk at kompensere for typestørrelser, når du beregner indekser, peger og så videre.


For eksempel:


DWORD dwa[4] = {1,2,3,4};
//dwa[2] references the third DWORD in the array (i.e., the ninth BYTE),
//NOT the second BYTE in the array


eller


struct EGS {
    char  str[5];
    int   num;
};
EGS   eg = {0};
EGS* peg = &eg;
peg++;
//peg is incremented by a whole EGS’ worth of bytes, NOT just 1
//for EGS, it is increased by 12 (5+4=9, rounded to the nearest 4, equals 12)





I dette tilfælde, fordi argumenterne fortolkes som brede (2-byte) tegn, er argv[1][1] ikke et null-tegn, det er det andet Unicode-tegn.


Ved at bruge programmet som det er og bestå et Unicode-tegn, får jeg det her:


C:>unicodeargtest ‽‽‽‽
203d, 203d, 203d, 203d


Jeg indsatte simpelthen interrobangerne i kommandoprompten. I min normale kommandoprompt-tilstand (ved hjælp af Rasterfonte og kode-side 437) vises de som ? i stedet for , men det giver stadig de samme resultater. [13]




Ved at caste argumenterne til char eller BYTE som sådan:


printf("\%x, \%x, \%x, \%x
",
    ((BYTE*)(argv[1]))[0], ((BYTE*)(argv[1]))[1],
    ((BYTE*)(argv[1]))[2], ((BYTE*)(argv[1]))[3]
);


Jeg får de forventede resultater:


C:>unicodeargtest ‽‽‽‽
3d, 20, 3d, 20

C:>unicodeargtest Foobar
46, 0, 6f, 0





Indsætte Unicode-tegn fungerer, men det er ikke muligt at bruge en batch-fil. En Unicode-en har stadig problemet med at programmets filnavn bliver fortolket forkert på grund af null-tegnene, og gemmer det som UTF-8 får det ikke til at køre i det hele taget.