Læs UTF8 filer på Windows og Linux via c ++

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har nogle tekstfiler, der er kodet ved hjælp af UTF-8. Er der en måde at læse dem ved hjælp af c + + stream klasser (wifstream for eksempel)?


Jeg har set nogle eksterne referencer som boost og nogle kodeprojekt kodeuddrag. Men jeg vil ikke bruge det bare til dette formål.


På linux fungerer det på en eller anden måde ved at kalde imbue (std :: locale ('en\_US')), men ikke på windows. Jeg tror, ​​problemet er, at vinduet forudsætter, at wifstream er en UTF-16-kodet strøm. Kan jeg ikke angive unicode-kodningen med wifstream-klassen på en måde, så den bruger UTF-8 ikke UTF-16?

Bedste reference


Udover at bare læse bytes fra filen normalt og behandle dem som UTF-8 (f.eks. Ved ikke at overføre dem til noget, der forventer lokal kodede strenge, kun for ting, der forventer UTF-8), har Windows en anden måde at læse i UTF-8.


Du kan indstille en 'UTF-8' -tilstand på filbeskrivere og derefter bruge bred indtastning og udskrivning på den pågældende filbeskrivelse, og Microsoft's C-runtime håndterer at omdanne de brede tegn til og fra UTF-8-kodede byte-strømme:


#include <fcntl.h>
#include <io.h>
#include <stdio.h>

int main(void) {
  \_setmode(\_fileno(stdout), \_O\_U8TEXT);
  wprintf(L"x043ax043ex0448x043ax0430 x65e5x672cx56fd
");
}


Hvis du kører ovenstående program med output omdirigeret til en fil, får du en UTF-8-kodet fil.


Indstilling af en af ​​disse Unicode-tilstande på en filbeskrivelse har den ekstra effekt på konsoller, at bred karakterudgang faktisk vil fungere på konsollen. Jeg er ikke sikker på, hvorfor netop Microsoft valgte 'brudt' som standard, men i det mindste er der en måde at aktivere en 'ikke brudt' tilstand på.

Andre referencer 1


Du kan læse utf8 filer på Windows perfekt normalt - det eneste problem er, når du vil gøre noget med dem.


Næsten alle Windows API-opkald bruger UTF16 eller MBCS, du skal konvertere UTF8-MBCS, når du sender det til et Windows API - se Konvertering af C-Strings fra Local Encoding til UTF8 .