2012-09-03 31 views
10

Tôi rất vui khi thấy std::u16stringstd::u32string trong C++ 11, nhưng tôi tự hỏi tại sao không có std::u8string để xử lý trường hợp UTF-8. Tôi theo ấn tượng rằng std::string là dành cho UTF-8, nhưng nó dường như không làm điều đó rất tốt. Ý tôi là, không phải std::string.length() vẫn trả về kích thước của bộ đệm của chuỗi thay vì số ký tự trong chuỗi?std :: u16string, std :: u32string, std :: string, length(), size(), codepoints và ký tự

Vì vậy, phương pháp length() của các chuỗi chuẩn được định nghĩa cho các lớp C++ 11 mới như thế nào? Họ có trả về kích thước của bộ đệm của chuỗi, số lượng điểm mã, hoặc số ký tự (giả sử cặp thay thế là 2 điểm mã, nhưng một ký tự. Vui lòng sửa tôi nếu tôi sai)?

Và còn khoảng size(); không phải là nó bằng length()? Xem http://en.cppreference.com/w/cpp/string/basic_string/length vì nguồn gốc của sự nhầm lẫn của tôi. Vì vậy, tôi đoán, câu hỏi cơ bản của tôi là làm thế nào người ta sử dụng std::string, std::u16stringstd::u32string và phân biệt đúng kích thước bộ đệm, số điểm mã và số ký tự không? Không. Nếu bạn sử dụng các trình vòng lặp tiêu chuẩn, bạn có đang lặp qua các byte, các điểm mã hoặc các ký tự không?

+3

'std :: string' hoạt động tốt cho utf8 là' u16string' làm cho utf16: nó xử lý các phần tử của loại tương ứng và không xử lý các ký tự được biểu diễn bằng một chuỗi gồm nhiều phần tử. –

+0

Truy cập tại đây: http://utf8everywhere.org/#myth.strlen –

Trả lời

15

u16stringu32string không phải là "lớp C++ 11 mới". Chúng chỉ là typedefs của std::basic_string cho các loại char16_tcha32_t.

length luôn bằng size cho bất kỳ basic_string. Đây là số của T trong chuỗi, trong đó T là loại mẫu cho basic_string.

basic_string không phải là nhận thức Unicode theo bất kỳ cách nào, hình dạng hoặc biểu mẫu nào. Nó không có khái niệm về codepoints, graphemes, Unicode characters, Unicode normalization, hoặc bất cứ thứ gì thuộc loại này. Nó chỉ đơn giản là một trình tự có trật tự là T s. Điều duy nhất nhận biết Unicode về u16stringu32string là chúng sử dụng loại được trả về bởi u""U"" literals. Vì vậy, họ có thể lưu trữ các chuỗi được mã hóa Unicode, nhưng chúng không làm gì cần kiến ​​thức về mã hóa đã nói.

Lặp lại lặp qua các thành phần của T, không phải "byte, điểm mã hoặc ký tự". Nếu Tchar16_t, thì nó sẽ lặp qua char16_t s. Nếu chuỗi được mã hóa UTF-16, thì chuỗi này đang lặp qua các đơn vị mã UTF-16, không phải là các điểm mã hoặc byte Unicode.

+4

Trong thuật ngữ Unicode, 'T' =" đơn vị mã ". – dan04

+1

Và * đơn vị mã *! = * Điểm mã *. Họ là hai khái niệm khác nhau. Chỉ để tham khảo sau này vì tôi không biết ... – Eonil

1

Tất cả các loại chuỗi đều giống nhau: chúng giữ một chuỗi các phần tử, mỗi loại có loại ký tự cho chuỗi. length()size() cả hai đều trả lại số phần tử. Iterator iterator trên các phần tử. Phân tích cấp cao hơn, chẳng hạn như tìm ra số lượng ký tự, yêu cầu tính toán phức tạp hơn nhiều.

0

Hiện tại không có gì được tích hợp vào tiêu chuẩn để phân biệt giữa các đơn vị mã, điểm mã hoặc byte riêng lẻ. Tuy nhiên, dường như có một số thứ trong công việc để xử lý this sort of thing. Tùy thuộc vào những gì các ủy ban tiêu chuẩn quyết định, nó có thể là một phần của TR2 hoặc tiêu chuẩn tiếp theo.

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