wstring_convert可以只替换无效字符吗?

时间:2016-12-01 12:53:17

标签: c++11 character-encoding non-ascii-characters wstring

我目前正在开发一种工具,用于从游戏中提取档案以进行数据挖掘。我目前从档案中提取元数据(每个档案的文件数,文件名,打包/解包大小等),并将它们写入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做所有内部字符串处理,所以我可以获得一些处理不同编码字符串的经验。不幸的是,我不知道用于生成这些存档文件的确切编码。

0 个答案:

没有答案