Bonjour
Le code suivant ouvre un flux sur un fichier écrit en UCS-2 / UTF-16LE avec un BOM.
Sous Visual C++, le buffer de wchar_t ou la wstring sont correctement lus et affichés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 // Lecture UTF16-LE / UCS-2 wifstream UTFStream("MonFichier.s"); wchar_t buffer[16]; wstring headerString; UTFStream.read(buffer, 2); // Lecture du BOM UTFStream.imbue(locale(UTFStream.getloc(), new codecvt_utf16<wchar_t, 0xffff, little_endian>())); UTFStream.read(buffer, 16); getline(UTFStream, headerString); wcout.imbue(locale(UTFStream.getloc(), new codecvt_utf8<wchar_t, 0xffff, little_endian>())); wcout << buffer << endl; wcout << headerString << endl;
Par contre MinGW et g++ lit le buffer comme s'il s'agissait d'un tableau de char, avec un caractère sur deux égal à 0x00.
J'ai lu que gcc/g++ a supporté tardivement les jeux de caractères UTF16 mais j'ai la version 6.3.0 qui devrait être à jour.
Si je ne lis pas le BOM avant d'appliquer la locale par imbue, la fonction read ne lit rien du tout sur g++ alors que Visual C++ alimente le buffer avec buffer[0] = BOM.
La modification de la locale d'un flux de fichier et les conversions Unicode sont-elles spécifiées dans la norme ou est-ce sujet à l'implémentation de chaque compilateur et donc non portable?
Merci
Partager