c ++ - wcout skriver ikke bred karakter ud til kommandoprompten

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger at skrive følgende tegn ud i Windows kommandoprompt: ュ (U + FF6D).


Jeg kan se tegnet blive skrevet ud ved hjælp af WriteConsoleW. Jeg kan også se tegnet, hvis jeg bruger WideCharToMultiByte ved hjælp af CP\_ACP-kode siden (chcp returnerer 932: japansk). Men når jeg forsøger at bruge regelmæssig wcout på den samme streng, som WriteConsoleW udskriver korrekt, choker det.


Når jeg udfører setlocale (LC\_ALL, '') udskrives det English\_UnitedStates.1252 (standard kode side, jeg havde, da jeg installerede).


Hvorfor fejler det, når de andre lykkes?


Bemærk: Jeg genstartede maskinen for at ændre sin systemplacering til Japan japansk

Bedste reference


Standard locale for C ++ iostreams er altid 'C' locale. Fra C ++ 03-standarden, §27.4.2.3/4:



  locale getloc() const;

  
  Hvis ingen lokalitet er blevet gennemsyret, er en kopi af den globale C ++-lokal, locale(), i kraft på tidspunktet for konstruktionen.



Fra §22.1.1.2/1-2:



  locale() throw();

  
  Standardkonstruktor: et øjebliksbillede af den aktuelle globale lokalitet.

  
  Konstruerer en kopi af argumentet, der sidst blev sendt til locale::global(locale&), hvis det er blevet kaldt; ellers har de resulterende facetter en virtuel funktion semantik identisk med dem locale::classic().



Fra §22.1.1.5/4-6:



  static const locale& classic();

  
  'C' -stedet.

  
  Returnerer: En lokalitet, der implementerer den klassiske 'C' -positions semantik, svarende til værdien locale("C").

  
  Noter: Denne lokalitet, dens facetter og deres medlemsfunktioner ændres ikke med tiden.



Som std::cout og std::wcout har statisk lagringsvarighed, garanteres de at blive initialiseret før main bliver kaldt, og derfor vil altid have 'C' applikation opstart; det vil sige, at der ikke er noget nok tidligt nok til at udføre, at man kan ringe locale::global og ændre standardplaceringen til std::cout og std::wcout. Således skal du altid inddrage de globale strømme selv, hvis du vil bruge en ikke-standardkodeside.

Andre referencer 1


wcout er oprettet før udføres nogen kode i main. På det tidspunkt du kalder setlocale, er wcout allerede der, klar til at gøre dens ting. Det gør intet forsøg på at spore efterfølgende ændringer, du måtte gøre med setlocale, så det fortsætter med at bruge standard i stedet for hvad du har angivet med setlocale.