2014-09-27 28 views
5

Tôi đang cố gắng lặp qua chuỗi UTF-8. Vấn đề như tôi hiểu là các ký tự UTF-8 có độ dài thay đổi, vì vậy tôi không thể lặp lại char-by-char nhưng tôi phải sử dụng một số loại chuyển đổi. Tôi chắc chắn có một chức năng cho điều này trong C++ hiện đại nhưng tôi không biết nó là gì.Lặp lại qua chuỗi UTF-8 trong C++ 11

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string text = u8"řabcdě"; 
    std::cout << text << std::endl; // Prints fine 
    std::cout << "First letter is: " << text.at(0) << text.at(1) << std::endl; // Again fine. So 'ř' is a 2 byte letter? 

    for(auto it = text.begin(); it < text.end(); it++) 
    { 
    // Obviously wrong. Outputs only ascii part of the text (a, b, c, d) correctly 
    std::cout << "Iterating: " << *it << std::endl; 
    } 
} 

Biên soạn với clang++ -std=c++11 -stdlib=libc++ test.cpp

Từ những gì tôi đã đọc và wchar_twstring không nên được sử dụng.

+0

Không có nội dung nào là "ký tự UTF-8". Cho đến khi bạn đã quen thuộc với vấn đề này, nó sẽ bực dọc và bất tiện khi nhảy vào viết mã. –

+0

Bạn có đang sử dụng Unixoid hoặc trên các cửa sổ không? Và bạn có muốn codeunits, codepoints hoặc graphemes? (Nhân vật lố bịch phụ thuộc vào bối cảnh (và thậm chí cả bối cảnh có thể không đủ để quyết định), và có thêm tổn thương trong cửa hàng trên cửa sổ) – Deduplicator

+1

Bạn có thể muốn xem [đây] (http://en.cppreference.com/w/cpp/locale/wstring_convert/from_bytes). Ghi nhớ nó không hoạt động trong gcc, chúng chưa thực hiện phần này của tiêu chuẩn, nhưng hoạt động trong clang/libC++ và nên làm việc với VS2013 IIRC. –

Trả lời

3

Như n.m. đề nghị tôi dùng std::wstring_convert:

#include <codecvt> 
#include <locale> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::u32string input = U"řabcdě"; 

    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> converter; 

    for(char32_t c : input) 
    { 
    std::cout << converter.to_bytes(c) << std::endl; 
    } 
} 

Có lẽ tôi nên đã quy định rõ ràng hơn trong những câu hỏi mà tôi muốn biết nếu điều này là có thể làm trong C++ 11 mà không cần dùng bất kỳ thư viện của bên thứ ba như ICU hoặc UTF8-CPP.

+0

Bạn đã sử dụng phiên bản g ++ nào? nó có thể là một phần của C++ 14 – Splash

+0

Tôi sử dụng clang: Apple LLVM phiên bản 7.0.0 (clang-700.0.72), nhưng đây là tất cả C++ 11. Bạn có thể kiểm tra tại http://en.cppreference.com –

+0

Tôi đã chạy tại http://en.cppreference.com/w/cpp/locale/codecvt_utf8 và chọn phiên bản 4.9 C++ 11 và nó không hoạt động t biên dịch. Bạn có thể xem không? – Splash

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