Bonjour

Le code suivant ouvre un flux sur un fichier écrit en UCS-2 / UTF-16LE avec un BOM.
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;
Sous Visual C++, le buffer de wchar_t ou la wstring sont correctement lus et affichés.

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