我目前正在开发一种工具,用于从游戏中提取档案以进行数据挖掘。我目前从档案中提取元数据(每个档案的文件数,文件名,打包/解包大小等),并将它们写入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();
}
通过读取二进制模式为std::ifstream
的文件来填充IndexEntry结构。 converter.from_bytes()
发生错误。某些文件名包含0x81作为字符,当转换器遇到这些时,它会引发std::range_error
异常。
有没有办法告诉wstring_convert
替换无法用其他内容转换的字符?或者是否有更好的方法来处理这种转换?
整个项目主要是学习练习。我想用wstring做所有内部字符串处理,所以我可以获得一些处理不同编码字符串的经验。不幸的是,我不知道用于生成这些存档文件的确切编码。