2014-06-30 39 views
8

Câu hỏi đơn giản một lần nữa: có một số std::string, xác định ký tự nào là chữ số, ký hiệu, khoảng trắng, v.v ... đối với cài đặt ngôn ngữ và khu vực của người dùng (ngôn ngữ).Phân loại nhân vật

tôi quản lý để chia chuỗi thành một tập hợp các ký tự bằng cách sử dụng boost locale boundary analysis tool:

std::string text = u8"生きるか死ぬか"; 

boost::locale::boundary::segment_index<std::string::const_iterator> characters(
    boost::locale::boundary::character, 
    text.begin(), text.end(), 
    boost::locale::generator()("ja_JP.UTF-8")); 

for (const auto& ch : characters) { 
    // each 'ch' is a single character in japanese language 
} 

Tuy nhiên, tôi tiếp tục không thấy cách nào để xác định xem ch là một chữ số hoặc một biểu tượng hay bất cứ điều gì khác. Có boost string classification algorithms, nhưng những điều này dường như không hoạt động với bất cứ điều gì *segment_index::iterator.

Tôi cũng không thể áp dụng std::isalpha(std::locale), bởi vì tôi không chắc chắn liệu có thể chuyển đoạn tăng thành số char hoặc wchar_t hay không.

Có cách nào gọn gàng để phân loại biểu tượng không?

+2

Như thường lệ: những người, downvote: tại sao? Có gì sai với câu hỏi? Bạn có chắc chắn biết câu trả lời đúng không? – Ixanezis

+0

Nếu tôi không sai, gõ 'ch' là' phân đoạn ', và một phân đoạn được tạo thành bởi một cặp lặp. Vì vậy, 'ch' chứa cặp lặp trên' văn bản' để phân định một ký tự. Vì các hàm phân loại chỉ đòi hỏi một giá trị 'char_type' và bạn đang sử dụng các ký tự nhiều byte, bạn có thể chuyển đổi từng phân đoạn trong một chuỗi widechar chỉ một ký tự (nếu không được thay thế trong chuỗi) và sau đó sử dụng hàm phân loại. Nó có ý nghĩa không? – Gonmator

+0

@Gonmator: Nếu tôi đưa bạn đúng, bạn đang đề xuất chuyển đổi 'std :: string' thành' std :: wstring' và sử dụng bất kỳ 'isdigit (str [0])' nào, giả định rằng 'str [0 ] 'bây giờ là viết tắt của một ký tự đơn. Nếu tôi không nhầm, điều này chỉ làm tăng cơ hội của mã hoạt động chính xác, nhưng, vẫn có những biểu tượng không thể được biểu diễn bằng một 'wchar_t' duy nhất, ví dụ: trong "שָלוֹם". Nếu tôi dựa vào đó, tôi có thể quên phân tích ranh giới tăng cường và chỉ sử dụng 'str [0]' nếu 'str' một chuỗi ký tự rộng. – Ixanezis

Trả lời

3

Có một số chức năng và các đối tượng hỗ trợ này trong <locale> nhưng ... Ví dụ văn bản mà bạn cung cấp cho trông giống như UTF-8, mà là một mã hóa nhiều byte, và các chức năng trong <locale> không làm việc với mã hóa nhiều byte.

Tôi khuyên bạn nên lấy thư viện ICU và sử dụng nó. Trong số các điều khoản khác, nó cho phép kiểm tra tất cả các thuộc tính được xác định trong Cơ sở dữ liệu ký tự Unicode. Nó cũng có các macro hoặc hàm để lặp qua một chuỗi (hoặc ít nhất là một mảng char), giải nén một điểm mã UTF_32 tại một thời điểm (đó là điều bạn muốn muốn kiểm tra).

+0

Cảm ơn. Tôi đã nghĩ rằng 'boost :: locale' bằng cách nào đó cung cấp các chức năng tôi đang tìm kiếm, bởi vì nó sử dụng ICU theo mặc định bên trong. Và hơn thế nữa, tôi không chắc rằng việc trích xuất một điểm mã UTF32 duy nhất là những gì tôi đang tìm kiếm, bởi vì khi các tài liệu thư viện tăng lên, có các biểu tượng bao gồm một số điểm mã UTF32, chẳng hạn như שָ – Ixanezis

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