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?
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
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
@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