boost :: program_option :: store генерирует исключение, когда строка параметра содержит символы смешанного языка

У меня есть простой код, который прекрасно работает с опцией ввода, содержит только символы ASCII, но выдает исключение с сообщением об ошибке «ошибка: преобразование символов не удалось». Есть ли решение?

Справочная информация:

    1. Compiler and OS: VC++2012 running on Windows 8.1 64 bit
2. "_UNICODE" option is ON    It works with command like: tmain.exe --input
3. "c:\test_path\test_file_name.txt"    It fails with command like:
tmain.exe --input "c:\test_path\test_file_name_中文.txt"    My default
4. I am using boost v1.53.
5. locale is Australian English.

Это исходный код:

#include <boost/program_options.hpp>
int _tmain(int argc, _TCHAR* argv[])
{
try {
std::locale::global(std::locale(""));
po::options_description desc("Allowed options");
desc.add_options()
("input",  po::value<std::string>(), "Input file path.")
;

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);

if (vm.count("input")) {
std::cout << "Input file path: " << vm["input"].as<std::string>();
}
return 0;
}
catch(std::exception& e) {
std::cerr << "error: " << e.what() << "\n";
return 1;
}
catch(...) {
std::cerr << "Exception of unknown type!\n";
}
return 0;
}

Я вошел в буст-коды и обнаружил, что из этой функции было сгенерировано исключение (boost_1_53_0 \ libs \ program_options \ src \ convert.cpp):

BOOST_PROGRAM_OPTIONS_DECL std::string
to_8_bit(const std::wstring& s,
const std::codecvt<wchar_t, char, std::mbstate_t>& cvt)
{
return detail::convert<char>(
s,
boost::bind(&codecvt<wchar_t, char, mbstate_t>::out,
&cvt,
_1, _2, _3, _4, _5, _6, _7));
}

Когда я вошел в буст-код, я обнаружил, что это утверждение

boost::program_options::parse_command_line(argc, argv, desc)

на самом деле работает нормально, это функция boost :: program_options :: store (), которая не может преобразовать строку в utf-8 обратно в wstring. Причиной этого сбоя может быть то, что моя текущая кодовая страница не поддерживает символы не ASCII. Я думаю, мой код работал бы хорошо, если бы моя текущая локаль была на китайском языке. Есть ли решение моей проблемы? Спасибо заранее.

2

Решение

Чтобы опция была в курсе Unicode, ее нужно добавить с wvalue вместо value, Попробуй это:

desc.add_options()("input",  po::wvalue<std::string>(), "Input file path.");
1

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

Других решений пока нет …