Lecture d'un fichier UTF-16 Little Endian sous MSVC et MinGW/g++
Bonjour
Le code suivant ouvre un flux sur un fichier écrit en UCS-2 / UTF-16LE avec un BOM.
Code:
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