2012-12-03 33 views
5
#include <algorithm> 
#include <iostream> 
#include <string> 
#include <vector> 

#define BOOST_SPIRIT_UNICODE // We'll use unicode (UTF8) all throughout 

#include <boost/spirit/include/qi.hpp> 
#include <boost/spirit/include/qi_parse.hpp> 
#include <boost/spirit/include/support_standard_wide.hpp> 

void parse_simple_string() 
{ 
    namespace qi = boost::spirit::qi;  
    namespace encoding = boost::spirit::unicode; 
    //namespace stw = boost::spirit::standard_wide; 

    typedef std::wstring::const_iterator iterator_type; 

    std::vector<std::wstring> result; 
    std::wstring const input = LR"(12,3","ab,cd","G,G\"GG","kkk","10,\"0","99987","PPP","你好)"; 

    qi::rule<iterator_type, std::wstring()> key = +(qi::unicode::char_ - qi::lit(L"\",\"")); 
    qi::phrase_parse(input.begin(), input.end(), 
        key % qi::lit(L"\",\""), 
        encoding::space, 
        result); 

    //std::copy(result.rbegin(), result.rend(), std::ostream_iterator<std::wstring, wchar_t> (std::wcout, L"\n")); 
    for(auto const &data : result) std::wcout<<data<<std::endl; 
} 

Tôi đã học bài này How to use Boost Spirit to parse Chinese(unicode utf-16)? và làm theo hướng dẫn, nhưng thất bại trong việc phân tích dòng chữ "你好"Làm thế nào để sử dụng boost :: tinh thần để phân tích UTF-8?

các kết quả mong đợi nên

12,3 ab, cd G, G \ "GG kkk 10, \" 0 99.987 PPP 你好

nhưng kết quả thực tế là 12,3 ab, cd G, G \ "GG kkk 10, \" 0 99.987 PPP

Không thể phân tích cú pháp từ Trung Quốc "你好"

OS là 64bits win7, tôi trình chỉnh sửa lưu các từ như UTF-8

+1

Tôi đang bối rối. Bạn đang ... sử dụng UTF8? Tại sao các wstring sau đó? (UTF8 là một chuỗi byte đơn/đôi/ba byte, phải). Tôi không cảm thấy đủ điều kiện để giải thích tốt hơn, nhưng điều này là không phù hợp trong nhận thức của tôi – sehe

+0

1-4 byte. Nhưng có, đó là một sự không phù hợp khá rõ ràng. Cho đến khi 'char8_t' được giới thiệu,' char' là kiểu lựa chọn UTF-8 nhiều nhất. – Puppy

+5

Những gì mọi người nói. 'wstring' chỉ sai khi sử dụng UTF-8. Nếu bạn muốn mã hóa UTF-8 đúng cách, * đặc biệt là * trên Windows, cách an toàn nhất là các chữ "U8" blah "' của C++ 11 (không có trong Visual Studio) hoặc sử dụng ký tự thoát byte với quyền mã hóa trực tiếp, tức là "\ xE4 \ xBD \ xA0 \ xE5 \ xA5 \ xBD" thay vì "你好". –

Trả lời

8

Nếu bạn có UTF-8 ở đầu vào, thì bạn có thể thử sử dụng Unicode Iterators từ Boost.Regex.

Ví dụ, sử dụng tăng :: u8_to_u32_iterator:

Một hai chiều iterator adapter mà làm cho một chuỗi cơ bản của nhân vật UTF8 trông giống như một (read-only) chuỗi các ký tự UTF32.

live demo

#include <boost/regex/pending/unicode_iterator.hpp> 
#include <boost/spirit/include/qi.hpp> 
#include <boost/range.hpp> 
#include <iterator> 
#include <iostream> 
#include <ostream> 
#include <cstdint> 
#include <vector> 

int main() 
{ 
    using namespace boost; 
    using namespace spirit::qi; 
    using namespace std; 

    auto &&utf8_text=u8"你好,世界!"; 
    u8_to_u32_iterator<const char*> 
     tbegin(begin(utf8_text)), tend(end(utf8_text)); 

    vector<uint32_t> result; 
    parse(tbegin, tend, *standard_wide::char_, result); 
    for(auto &&code_point : result) 
     cout << "&#" << code_point << ";"; 
    cout << endl; 
} 

Output là:

&#20320;&#22909;&#65292;&#19990;&#30028;&#65281;&#0; 
+0

+1 công việc tốt thưa ngài – sehe

Các vấn đề liên quan