Вообще говоря, std :: string правильно обрабатывает внедренные символы '\ 0'.
Тем не менее, при взаимодействии с const char * необходимо соблюдать особую осторожность.
В этом случае проблема уже возникает во время построения строки с:
std::string filter = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0"; // wrong
Здесь вы создаете std :: string из const char *. Поскольку конструктор не знает, сколько символов использовать для построения std :: string, он останавливается на первом «\ 0».
Можно копировать символы один за другим, но есть и лучший способ: использовать конструктор, требующий двух итераторов для массива char, один с началом и один с концом:
const char filter_[] = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
std::string filter(filter_, filter_ + sizeof(filter_));
Это выглядит ужасно, но, надеюсь, вы не будете делать это часто в своем коде.
Обновление: или с соответствующими определениями шаблонов begin () и end () (согласно комментарию Джеймса Канзе):
const char filter_[] = "Terrain Configuration (*.tcfg)\0*.tcfg\0\0";
std::string filter(begin(filter_), end(filter_));