Tôi đã nhận thấy phương thức chiều dài của std :: string trả về độ dài bằng byte và cùng một phương thức trong std :: u16string trả về số lượng các chuỗi 2 byte.Với C++ 11, tôi vẫn cần thư viện thao tác chuỗi không chuẩn cho văn bản Unicode?
Tôi cũng nhận thấy rằng khi một nhân vật hoặc điểm mã nằm ngoài BMP, chiều dài trả về 4 chứ không phải 2.
Hơn nữa, dãy thoát Unicode được giới hạn \ unnnn, vì vậy bất kỳ điểm mã trên Không thể chèn U + FFFF bằng chuỗi thoát.
Nói cách khác, dường như không có hỗ trợ cho cặp thay thế hoặc điểm mã bên ngoài BMP.
Cho điều này, là thực tiễn được chấp nhận hoặc được khuyến nghị sử dụng thư viện thao tác chuỗi không chuẩn để hiểu UTF-8, UTF-16, cặp thay thế, v.v.
Trình biên dịch của tôi có lỗi hay tôi đang sử dụng các phương pháp thao tác chuỗi chuẩn không chính xác?
Ví dụ:
/*
* Example with the Unicode code points U+0041, U+4061, U+10196 and U+10197
*/
#include <iostream>
#include <string>
int main(int argc, char* argv[])
{
std::string example1 = u8"A䁡";
std::u16string example2 = u"A䁡";
std::cout << "Escape Example: " << "\u0041\u4061\u10196\u10197" << "\n";
std::cout << "Example: " << example1 << "\n";
std::cout << "std::string Example length: " << example1.length() << "\n";
std::cout << "std::u16string Example length: " << example2.length() << "\n";
return 0;
}
Đây là kết quả tôi nhận được khi biên soạn với GCC 4.7:
Escape Example: A䁡မ6မ7
Example: A䁡
std::string Example length: 12
std::u16string Example length: 6
Cảm ơn câu trả lời. Tôi cũng quan tâm đến các phương pháp thao tác chuỗi khác như chất nền và cách chúng xử lý UTF-8, UTF-16, cặp thay thế, vv Tôi nên rõ ràng hơn. Tôi đã sử dụng độ dài vì đây là ví dụ dễ nhất để đăng. –
@Ragsdale 30 cal Phải. Tôi cho rằng chúng ta sẽ phải chấp nhận rằng tất cả các phương thức này hoạt động trên các đơn vị mã, không phải là các ký tự, mặc dù các mô tả hơi gây nhầm lẫn. Iterator là một ví dụ tốt. – jogojapan
Vì vậy, nói cách khác, cách tiêu chuẩn duy nhất để làm việc với Unicode là chuyển đổi văn bản thành UTF-32 và sử dụng std :: u32string? Điều đó có vẻ khá lãng phí. –