Может ли wstring_convert просто заменить недопустимые символы?
В настоящее время я работаю над инструментом для извлечения архивов из игры с целью интеллектуального анализа данных. В настоящее время я извлекаю метаданные из архивов (количество файлов в архиве, имена файлов, упакованные / распакованные размеры и т. Д.) И записываю их в std::wstring
для дальнейшего анализа. Я наткнулся на проблему с преобразованием имен файлов в широкие символы, используя std::wstring_conver
,
Мой код выглядит примерно так:
struct IndexEntry {
int32_t file_id;
std::array<char, 260> filename;
// more fields
}
wstring foo(IndexEntry entry) {
std::wstringstream buffer;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
buffer << entry.file_id << L'\n';
buffer << converter.from_bytes(entry.filename.data()) << L'\n';
// add rest of the IndexEntry fields to the stream
return buffer.str();
}
Структура IndexEntry заполняется чтением из файлов с std::ifstream
в двоичном режиме. Ошибка происходит с converter.from_bytes()
, Некоторые имена файлов содержат символ 0x81, и когда конвертер встречает их, он выдает std::range_error
исключение.
Есть ли способ сказать wstring_convert
заменить символы, это не может преобразовать что-то еще? Или есть вообще лучший способ справиться с этим преобразованием?
Весь этот проект - в основном учебное упражнение. Я хотел выполнить всю внутреннюю обработку строк с помощью wstring, чтобы получить некоторый опыт работы со строками в разных кодировках. К сожалению, я не знаю, какая именно кодировка использовалась для создания этих архивных файлов.