QString có ưu điểm gì hơn std :: string? Có thể bình thường std :: string lưu trữ unicode ký tự? Tôi đang cố gắng viết một chương trình sẽ mở các tệp bài hát khác nhau. Tên của các tệp này có thể bằng các ngôn ngữ khác nhau. Tôi đã nghe nói rằng bằng cách sử dụng một chuỗi bình thường trong trường hợp như vậy sẽ không hoạt động đúng. Tôi muốn giữ ứng dụng độc lập với QT và tái sử dụng mã ví dụ trong android. Bạn có đề nghị gì .ưu điểm của QString so với std :: string
Trả lời
QString
cho phép bạn làm việc với Unicode, có nhiều phương pháp hữu ích hơn và tích hợp với Qt tốt. Nó cũng có hiệu suất tốt hơn, như cbamber85noted.
std::string
chỉ lưu trữ các byte khi bạn cấp chúng cho nó, nó không biết gì về mã hóa. Nó sử dụng một byte cho mỗi ký tự, nhưng nó không đủ cho tất cả các ngôn ngữ trên thế giới. Cách tốt nhất để lưu trữ văn bản của bạn có lẽ sẽ là mã hóa UTF-8, trong đó các ký tự có thể chiếm số byte khác nhau và std::string
không thể xử lý đúng cách! Điều này, ví dụ, có nghĩa là phương pháp length
sẽ trả lại số byte, không phải ký tự. Và đây chỉ là đỉnh của tảng băng trôi ...
Tôi đang tìm cách tránh những thứ QT, có cách nào khác không? –
Để công bằng, std :: string cũng cho phép bạn sử dụng unicode, mặc dù được cấp, điều đó không có nghĩa là dữ liệu nằm trong một mã hóa cụ thể. Bạn có nghĩa là QString cho phép chuyển đổi unicode không? – Arafangion
Vihaan, nếu bạn đang cố gắng tránh các công cụ Qt tại sao bạn lại sử dụng nó? Nếu bạn phải giao tiếp với các thành phần Qt thì sử dụng QString giúp cuộc sống của bạn dễ dàng hơn nhiều. – Joey
Tôi không quen thuộc với QString
, nhưng lợi thế lớn của std::string
là nó là chuẩn. Liên quan đến Unicode, không có vấn đề lưu trữ UTF-8 trong một std::string
; tùy thuộc vào những gì bạn đang làm, tuy nhiên, có thể tốt hơn nếu sử dụng một số std::wstring
(thường là sẽ lưu trữ UTF-16 hoặc UTF-32).
Đối với các thao tác phức tạp của Unicode, tôi sẽ đề xuất ICU. Nhưng đối với một số lượng đơn đăng ký , chỉ cần lưu trữ UTF-8 là đủ.
'QString' là trung gian hợp lý. Nó không cung cấp đầy đủ chức năng ICU, nhưng nó có thể làm những việc đơn giản như chuyển đổi từ/sang UTF-8/16/32 – MSalters
+1 Gắn bó với tiêu chuẩn luôn là một lợi thế. Lưu các loại khuôn khổ spesific để sử dụng khung. Tôi đã chỉ tự hỏi, những gì lợi thế sẽ là một chuỗi UTF-16 hoặc UTF-32 cho trong trường hợp unicode vs std :: string? – daramarak
@ daramarak Nó phụ thuộc vào những gì bạn làm với các chuỗi trong mã. 'std :: string' thực sự không nhiều hơn một container đơn giản, với một vài hàm bổ sung để thay thế một số _bytes_ chứa. Nó không có kiến thức về các ký tự hoặc mã hóa, ít hơn nhiều bất cứ điều gì liên quan đến văn bản. Nếu bạn đang thao tác văn bản, có thể là một lớp đại diện cho văn bản sẽ phù hợp hơn. Hoặc, một cách khác, một thư viện xử lý 'std :: string' thành văn bản UTF-8. –
Về mặt kỹ thuật, có một lớp chuỗi tiêu chuẩn để lưu trữ bất kỳ loại ký tự nào: std::basic_string
. std::string
và std::wstring
không là gì trừ các chuyên môn của std::basic_string
cho char
và wchar
. Ngoài ra còn có các chuyên ngành std::u16string
và std::u32string
có nghĩa là để lưu trữ UTF-16 và UTF-32.
Dù sao, nếu bạn phải làm việc với Qt, QString
có lẽ sẽ luôn thay thế tốt hơn bất kỳ chuỗi thư viện chuẩn nào do toàn bộ khuôn khổ Qt được thiết kế để làm việc với nó.
Nếu bạn đang sử dụng khung Qt để viết phần mềm của mình thì bạn nên sử dụng QString tốt hơn. Lý do đơn giản là hầu như tất cả các hàm Qt hoạt động trên chuỗi sẽ chấp nhận QString. Nếu bạn sử dụng std :: string bạn có thể kết thúc trong các tình huống mà bạn sẽ phải đánh máy từ một đến khác. Bạn nên cân nhắc sử dụng std :: string nếu phần mềm của bạn không sử dụng Qt. Điều đó sẽ làm cho mã của bạn dễ dàng hơn và không phụ thuộc vào một khung phụ mà người dùng sẽ phải cài đặt để sử dụng phần mềm của bạn.
Sử dụng một khung công tác không nên là lý do để thư viện khuôn khổ thấm qua toàn bộ mã. Chuyển đổi tại ranh giới ui là một mức giá nhỏ để trả tiền để ngăn chặn khóa nhà cung cấp. – daramarak
@daramarak Bạn nói đúng nhưng sau đó Qt không chỉ là một khung giao diện người dùng. Nó cung cấp tất cả các loại không giao diện người dùng-công cụ cũng như mạng, SQL, XML, Scripting vv Vì vậy, tùy thuộc vào cách rộng rãi một là sử dụng khuôn khổ, người ta có thể mất một cuộc gọi. – Pankaj
http://www.joelonsoftware.com/articles/Unicode.html – Arafangion
Điều này có thể giúp trả lời một phần câu hỏi của bạn http://stackoverflow.com/questions/6028093/unicode-stdstring-class-replacement – kenny
@Arafangion : Đó là một nửa của niềm vui ... bạn cũng nên thêm tất cả các mớ hỗn độn về mã hóa hệ thống tập tin vào hình ảnh – 6502