Преобразовать std :: string с двоичной последовательностью байтов в std :: wstring с набором символов из текущей локали

В настоящий момент я дважды читаю один и тот же файл, потому что мне нужны два разных представления: (а) необработанная последовательность байтов без какого-либо преобразования, (б) текстовое представление с байтами, конвертируемыми в текущий набор символов выполнения. По сути, код выглядит так:

using namespace std;
const char* fileName = "test.txt";

// Part 1: Read the file unmodified byte-per-byte
string binContent;
ifstream file1( fileName, ifstream::binary );
while( true ) {
char c;
file1.get( c );
if( !file1.good() ) break;
binContent.push_back( c );
}

// Part 2: Read the file and convert the character code according to the
// current locale from external character set to execution character set
wstring textContent;
wifstream file2( fileName );
wifstream.imbue( locale("") );
while( true ) {
wchar_t c;
file2 >> c;
if( !file2.good() ) break;
textContent.push_back( c );
}

Очевидно, код читает один и тот же файл дважды. Я хотел бы избежать этого и напрямую конвертировать binaryContent в textContent в памяти.

Обратите внимание, что это больше, чем просто char в wchar_t преобразование, потому что оно также может включать в себя истинное преобразование символов, если кодировка символов текущей локали locale("") отличается от исполнения кодировки символов. Такое преобразование может быть необходимым, даже если textContent тоже была узкая строка символов.

В приведенном выше примере магия преобразования персонажей в части 2 происходит в template<typename _CharT, typename _Traits> bool basic_filebuf<_CharT, _Traits >::_M_convert_to_external( _CharT* __ibuf, streamsize __ilen ) в fstream.tcc и включает в себя использование codecvt аспект локали.

Я надеялся на способ построить wistringstream объект из binContent объект вместо wifsteam а затем пропитывая wistringstream с правильным языком. Но это, похоже, не работает, потому что все конструкторы wistringstream уже ожидают широкого характера, и при этом wistringstream кажется, реализовать логику преобразования wifstream,

Есть ли лучший способ (то есть более краткий и менее подверженный ошибкам), чем использование codecvt вручную?

2

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector