How to read file which contains \uxxxx in vc++

后端 未结 4 1884
遇见更好的自我
遇见更好的自我 2020-12-12 00:14

I have txt file whose contents are:

\\u041f\\u0435\\u0440\\u0432\\u044b\\u0439_\\u0438\\u043d\\u0442\\u0435\\u0440\\u0430\\u043a\\u0442\\u0438\\u0432\

4条回答
  •  余生分开走
    2020-12-12 00:57

    Here is an example for MSalters's suggestion:

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    #include 
    #include 
    #include 
    
    std::wstring convert_unicode_escape_sequences(const std::string& source) {
      const boost::regex regex("\\\\u([0-9A-Fa-f]{4})");  // NB: no support for non-BMP characters
      boost::scoped_array buffer(new wchar_t[source.size()]);
      wchar_t* const output_begin = buffer.get();
      wchar_t* output_iter = output_begin;
      std::string::const_iterator last_match = source.begin();
      for (boost::sregex_iterator input_iter(source.begin(), source.end(), regex), input_end; input_iter != input_end; ++input_iter) {
        const boost::smatch& match = *input_iter;
        output_iter = std::copy(match.prefix().first, match.prefix().second, output_iter);
        std::stringstream stream;
        stream << std::hex << match[1].str() << std::ends;
        unsigned int value;
        stream >> value;
        *output_iter++ = boost::numeric_cast(value);
        last_match = match[0].second;
      }
      output_iter = std::copy(last_match, source.end(), output_iter);
      return std::wstring(output_begin, output_iter);
    }
    
    int wmain() {
      std::locale::global(std::locale(""));
      const std::wstring filename = L"test.txt";
      std::ifstream stream(filename.c_str(), std::ios::in | std::ios::binary);
      stream.seekg(0, std::ios::end);
      const std::ifstream::streampos size = stream.tellg();
      stream.seekg(0);
      boost::scoped_array buffer(new char[size]);
      stream.read(buffer.get(), size);
      const std::string source(buffer.get(), size);
      const std::wstring result = convert_unicode_escape_sequences(source);
      std::wcout << result << std::endl;
    }
    

    I'm always surprised how complicated seemingly simple things like this are in C++.

提交回复
热议问题