2014-02-20 30 views
2

我有一個簡單的代碼,可以很好地處理輸入選項只包含ASCII字符,但會拋出一個錯誤消息爲「error:character conversion failed」 。有解決方案嗎?boost :: program_option :: store當選項字符串包含混合語言字符時,會拋出異常

背景信息:

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 \庫\拋出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)); 
} 

當我進入升壓代碼時,我發現ou牛逼這種說法

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

實際工作正常,它是無法字符串轉換爲UTF-8回的wstring了boost :: program_options ::店()函數。這種失敗的原因可能是我目前的代碼頁不支持非ASCII字符。如果我當前的語言環境是基於中文的,我想我的代碼會很好用。有沒有解決我的問題?提前謝謝了。

回答

1

對於一個選項是Unicode知道它必須與wvalue,而不是value添加。試試這個:

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

怎麼樣的時候,我運行除了程序名不帶參數的程序,它拋出'字符轉換failed' – Victor

相關問題