2014-02-20 8 views
2

입력 옵션에 완벽하게 작동하는 간단한 코드가 있지만 ASCII 문자 만 포함되어 있지만 "오류 : 문자 변환에 실패했습니다"라는 오류 메시지가있는 예외가 발생합니다. . 해결책이 있습니까?옵션 문자열에 혼합 언어 문자가 포함되어있을 때 boost :: program_option :: store가 예외를 throw합니다.

배경 정보는 :

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)); 
} 

부스트 코드를 사용할 때 ou 이 문장

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

실제로 잘 작동 t, 그것은 UTF-8로 다시 형식 wstring에 문자열을 변환하는 데 실패 부스트 :: program_options : 저장() 함수입니다. 이 오류의 원인은 현재 코드 페이지가 비 ASCII 문자를 지원하지 않기 때문일 수 있습니다. 내 현재 로케일이 중국어 기반이라면 내 코드가 잘 작동 할 것입니다. 내 문제에 대한 해결책이 있습니까? 미리 감사드립니다.

답변

1

유니 코드 인식 옵션의 경우 value 대신 wvalue을 추가해야합니다. 이것을 시도하십시오 :

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

프로그램 이름과 별도의 인수없이 프로그램을 실행하면 '문자 변환에 실패했습니다.'라는 메시지가 표시됩니다. – Victor