2012-04-27 38 views
20

Tôi hiểu rằng QString::split nên được sử dụng để lấy số QStringList từ số nhiều QString. Nhưng nếu tôi có một tập tin và tôi không biết nếu nó đến từ Mac, Windows hoặc Unix, tôi không chắc chắn nếu QString.split("\n") sẽ làm việc tốt trong tất cả các trường hợp. Cách tốt nhất để xử lý tình huống này là gì?QString :: split() và " r", " n" và " r n" quy ước

Trả lời

34

Bạn có thể thử:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); 

này chia tách chuỗi bất cứ khi nào bất kỳ kí tự xuống dòng (hoặc thức ăn đường hoặc vận chuyển trở lại) được tìm thấy.

+3

Tôi nghĩ bạn đã bỏ lỡ một số điểm. Xem câu trả lời của tôi. –

21

Emanuele Bezzi's answer bỏ lỡ một vài điểm.

Trong hầu hết các trường hợp, chuỗi được đọc từ tệp văn bản sẽ được đọc bằng luồng văn bản, tự động dịch biểu diễn cuối cùng của hệ điều hành thành một ký tự '\n'. Vì vậy, nếu bạn đang xử lý các tệp văn bản gốc, '\n' phải là dấu phân cách duy nhất bạn cần phải lo lắng. Ví dụ: nếu chương trình của bạn đang chạy trên hệ thống Windows, đọc đầu vào ở chế độ văn bản, kết thúc dòng sẽ được đánh dấu trong bộ nhớ với một ký tự \n; bạn sẽ không bao giờ thấy các cặp "\r\n" tồn tại trong tệp.

Nhưng đôi khi bạn cần phải xử lý tệp văn bản "nước ngoài".

Lý tưởng nhất, bạn có thể nên dịch bất kỳ tệp nào như vậy sang định dạng cục bộ trước khi đọc chúng, điều này tránh được sự cố. Chỉ có tiện ích dịch thuật cần phải nhận thức được kết thúc dòng biến thể; mọi thứ khác chỉ đề cập đến văn bản.

Nhưng điều đó không phải lúc nào cũng có thể; đôi khi bạn có thể muốn chương trình của bạn xử lý các tệp văn bản Windows khi chạy trên hệ thống POSIX (Linux, UNIX, v.v.) hoặc ngược lại.

Tệp văn bản định dạng Windows trên hệ thống POSIX sẽ xuất hiện để có thêm ký tự '\r' ở cuối mỗi dòng.

Tệp văn bản định dạng POSIX trên hệ thống Windows sẽ xuất hiện bao gồm một dòng rất dài với các ký tự được nhúng '\n'.

Cách tiếp cận chung nhất là đọc tệp ở chế độ nhị phân và xử lý kết thúc dòng một cách rõ ràng.

Tôi không quen thuộc với QString.split, nhưng tôi nghi ngờ rằng đây:

QString.split(QRegExp("[\r\n]"),QString::SkipEmptyParts); 

sẽ bỏ qua dòng sản phẩm nào, mà sẽ xuất hiện dưới dạng "\n\n" hoặc như "\r\n\r\n", tùy thuộc vào định dạng. Dòng trống là dữ liệu văn bản hoàn toàn hợp lệ; bạn không nên bỏ qua chúng trừ khi bạn chắc chắn rằng nó có ý nghĩa để làm như vậy.

Nếu bạn cần để đối phó với nhập văn bản được phân định bằng cách "\n", "\r\n", hoặc "\r", sau đó tôi nghĩ rằng một cái gì đó như thế này:

QString.split(QRegExp("\n|\r\n|\r")); 

sẽ thực hiện công việc. (Cảm ơn lời bình luận của parsley72 đã giúp tôi với cú pháp biểu thức chính quy.)

Một điểm khác: có thể bạn không có khả năng gặp phải các tệp văn bản chỉ sử dụng '\r' để phân tách các dòng. Đó là định dạng được sử dụng bởi MacOS lên đến phiên bản 9. MaxOS X dựa trên UNIX, và nó sử dụng tiêu chuẩn UNIX kiểu '\n' dòng kết thúc (mặc dù nó có thể chịu được '\r' kết thúc dòng là tốt).

+0

TIL rằng Mac OS X không còn sử dụng '\ r', cảm ơn. – sashoalm

+1

'|' không yêu cầu ký tự thoát, nhưng tiếc là thay đổi quá nhỏ để tôi có thể chỉnh sửa! – parsley72

+0

@ parsley72: Cảm ơn, đã sửa. Một số cú pháp rexexp sử dụng '\ |'; QRegExp không, nhưng ngay cả khi nó đã làm '\' sẽ cần phải được thoát trong chuỗi chữ, vì vậy tôi đã sai một trong hai cách. –

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