2013-06-05 18 views
8

Tôi muốn xác thực văn bản của QLineEdit bằng cụm từ thông dụng. Nó cho phép các ký tự từ a đến z cộng với A đến Z cộng với ký tự Thổ Nhĩ Kỳ (ğüşöçİĞÜŞÖÇ) cộng với số từ 0 đến 9. Tôi googled về vấn đề của tôi và tìm thấy hai giải pháp nhưng không ai làm việc cho tôi. Trong một giải pháp nó nói "bao gồm các nhân vật Thổ Nhĩ Kỳ trong regexp" và trong một khác nó nói "unicodes sử dụng các ký tự tiếng"Nhân vật Thổ Nhĩ Kỳ Qt trong cụm từ thông dụng

Dưới đây là hai biểu thức reqular

QRegExp exp = QRegExp("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$"); 

QRegExp exp = QRegExp("^[a-zA-Z0-9\u00E7\u011F\u0131\u015F\u00F6\u00FC\u00C7\u011E\u0130\u015E\u00D6\u00DC]+$"); 

Cả một trong những biểu reqular trên có thể xác nhận tên 'İSMAİL'. Ngoài ra tôi đã thử một văn bản chỉ chứa các ký tự Thổ Nhĩ Kỳ ('ğüşöçİĞÜŞÖÇ') nhưng không thể xác thực được. Khi tôi xóa ký tự 'İ' khỏi cả hai văn bản, chúng có thể được xác thực. Tôi đoán vấn đề có thể liên quan đến ký tự 'İ'.

Tôi làm cách nào để khắc phục sự cố?

Lưu ý: Chúng tôi đang sử dụng Qt 4.6.3 trong dự án của mình.

+0

Nhìn vào đề xuất ban đầu của bạn, '^ [a-zA-Z0-9ğüşöçİĞÜŞÖÇ] + $' hoạt động tốt cho tôi trong tất cả các đối sánh regex tôi đã thử (ví dụ: http://www.regex101.com/r/gR2xB2) . Bạn có chắc chắn vấn đề không phải ở nơi khác? – mart1n

Trả lời

14

Tôi nghĩ đây là sự cố mã hóa. Bạn sử dụng dàn diễn viên tiềm ẩn từ const char* đến QString kết quả bằng cách sử dụng QString::fromAscii. Nếu bạn muốn sử dụng mã hóa không phải Latin1 ở đây, bạn cần gọi số QTextCodec::setCodecForCStrings và đặt mã hóa tệp nguồn của bạn được lưu. Tôi sẽ sử dụng mã hóa UTF-8, do đó, khi khởi tạo ứng dụng nên được thực hiện như sau:

QTextCodec::setCodecForCStrings(QTextCodec::codecForName("utf-8")); 
QRegExp exp = QRegExp("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$"); 
qDebug() << exp.exactMatch("İSMAİL"); // <= true 

Tôi đề xuất giải pháp rõ ràng hơn để kiểm tra xem sự cố của bạn có ở đây không. Lưu mã của bạn trong mã UTF-8 và sử dụng QString::fromUtf8 để chuyển đổi xâu của bạn để QString sử dụng UTF-8 một cách rõ ràng:

QRegExp exp = QRegExp(QString::fromUtf8("^[a-zA-Z0-9ğüşöçİĞÜŞÖÇ]+$")); 
qDebug() << exp.exactMatch(QString::fromUtf8("İSMAİL")); // <= true 
+0

Khi tôi thử giải pháp đầu tiên của bạn như thế này nó trả về true: 'QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName (" utf-8 ")); exp.exactMatch ("İSMAİL"); ... 'Nhưng khi tôi thử giải pháp đầu tiên của bạn như thế này nó trả về false:' QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName ("utf-8")); Tên QString = ui.txtName-> text(); // text() trả về "İSMAİL" của khóa học exp.exactMatch (name); 'Tại sao điều này xảy ra? – onurozcelik

+0

Tôi không thể tái tạo điều này. Bạn có chắc chắn rằng mọi thứ giống hệt nhau ngoại trừ '" İSMAİL "' được thay thế thành 'ui.txtName-> text()'? –

+0

Đây là liên kết của mã thử nghiệm của tôi: [Mã thử nghiệm] (http://db.tt/gwsWbbbD). Tôi đã thử nghiệm nó với các từ "İSMAİL", "şule", "ışık" và không ai trong số họ vượt qua. Nói cho tôi biết tôi đang làm gì sai. – onurozcelik

2

Bạn có thể thử kết hợp ^\p{L}+$, là viết tắt của bất kỳ chữ cái nào.

1

có lẽ hầu hết bạn cần \w. It includes bất kỳ ký tự nào (bất kỳ ngôn ngữ nào) và ký tự gạch dưới.
Bạn có thể loại trừ gạch dưới như vậy (?!_)\w.

+0

\ w không hỗ trợ chữ cái đánh bóng trong qt 5.7 – Adam

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