2010-11-17 40 views

Trả lời

15

KHÔNG xuất phát từ STRING

std :: string, đó là, về cơ bản toàn bộ mẫu basic_string không được thiết kế để được bắt nguồn từ đâu. Có rất nhiều bài viết về điều đó. Nó không có bất kỳ chức năng ảo nên không có gì để ghi đè lên. Điều tốt nhất bạn có thể làm là che giấu điều gì đó. Tốt nhất là sử dụng thành phần/tập hợp! Đó là, chỉ cần giữ một thành viên của chuỗi kiểu trong lớp của bạn và chuyển tiếp các cuộc gọi! Một lần nữa, chỉ để chắc chắn

KHÔNG xuất phát từ STRING

+2

-1. Thực tiễn tốt nhất cho nhiệm vụ này là cung cấp một đối tượng Character Traits và khởi tạo 'std :: basic_string'. Ẩn một 'std :: string' trong trường hợp này làm tăng vấn đề ký hiệu' char', vì UTF-8 là một mã hóa nhiều byte 8 bit. –

+1

@ larsmans: Không phản đối :) Tôi đã quá bận tâm với thực tế là một người nào đó ở đâu đó có ý nghĩ lấy được từ một loại phi đa hình :) –

+0

-1. Không thực sự trả lời câu hỏi. câu trả lời của người larsman ít nhất đưa ra một ý tưởng tốt cho một hướng đi. – leetNightshade

1
  1. Bạn đã nhìn ICU?

  2. Một typedef chỉ là một nhãn thuận tiện.

    lớp foo: thanh công cộng {};

hoạt động tốt khi thanh là typedef của PT.

Có thể không có ý tưởng hay trong trường hợp này, nhưng ngôn ngữ hỗ trợ nó.

4

Nó thường được coi là một sai lầm trong C++ để lấy được từ một thùng chứa thư viện chuẩn. Tuy nhiên, chức năng bạn đang tìm kiếm đã được triển khai. Có một cái nhìn tại Glib::ustring.

Hy vọng điều này sẽ hữu ích!

0

Ý tưởng tốt hơn: tạo vùng chứa utf8_string tương thích STL mà không kế thừa từ chuỗi std ::.

19

Nếu bạn phải xác định loại chuỗi riêng của bạn, sau đó không kế thừa từ std::string nhưng định nghĩa lớp Character Traits riêng của bạn và làm một cái gì đó giống như

typedef std::basic_string<unsigned char, utf8_traits> utf8string; 

Xem thêm Herb Sutter's website.

+0

+1 - có một lý do 'std :: string' là một' typedef', và đây là nó. –

+0

Mặt khác, tôi sẽ không sử dụng 'basic_string' để xử lý chuỗi UTF-8. Bạn sẽ hại nhiều hơn bất cứ khi nào bạn cố gắng thao túng nó. –

+3

@Matthieu M., phụ thuộc hoàn toàn vào cách bạn triển khai các đặc điểm của nhân vật. Tôi có thể thấy hai tùy chọn: hoặc đóng gói chúng như là UTF-8 trực tiếp và thực hiện 'state_type', hoặc gói chúng dưới dạng UTF-32 và chuyển đổi ở ranh giới. Dù bằng cách nào, đó là rất nhiều công việc, nhưng nó vẫn giữ khả năng tương thích với các thuật toán STL. –

-1

Như đã được người khác tuyên bố: không lấy được từ std::string, nó không được thiết kế cho việc này.

Bạn nên có một cái nhìn trên this article, trong đó cho thấy cách tạo một chuỗi chuỗi phân biệt chữ hoa chữ thường làm ví dụ. Bạn sẽ thấy rằng logic được thực hiện trong std::basic_string độc lập với loại ký tự và việc cung cấp một số tùy chỉnh char_traits sẽ thực hiện thủ thuật.

+1

Thực ra tôi không khuyên bạn nên làm điều này. Tôi đã làm điều này một vài năm trước và tôi đã phải hối tiếc quyết định đó. Điều gì sẽ xảy ra là bạn sẽ phải chuyển đổi qua lại giữa loại mới này và loại chuỗi tiêu chuẩn, tất cả trên cơ sở mã của bạn. Nó không đẹp. Một bài viết tuyệt vời giải thích chi tiết được tìm thấy ở đây: http://lafstern.org/matt/col2_new.pdf. Tóm tắt: Trường hợp vô cảm không phải là về một đối tượng, đó là về cách bạn sử dụng một đối tượng. –

0

Viết thực thi unicode phù hợp và hoạt động bình thường trong mọi trường hợp là rất khó thực hiện. Tôi sẽ khuyên bạn nên sử dụng thư viện hoặc triển khai hiện có thay vì sử dụng thư viện của riêng bạn. Ví dụ, Windows, OSX và Qt đều có thư viện hỗ trợ UTF-16 và các chuỗi được mã hóa khác.

1

Chỉ cần chắc chắn bạn biết bạn đang làm gì trước tiên. Chính xác "độ dài chính xác" bạn muốn trả về từ các đối tượng chuỗi của bạn là gì? Số điểm mã?Điều đó không phải lúc nào cũng tương ứng với số ký tự mà người dùng nhận thấy.

Dù sao, hãy xem thư viện utf8-cpp để xem cách tiếp cận khác để phát sinh từ std :: string.

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