2013-06-05 5 views
8

QLineEdit의 텍스트를 정규 표현식으로 검증하려고합니다. 그것은 ~에서 Z까지 플러스 A부터 Z 플러스 터키어 문자 (ğüşöçİĞÜŞÖÇ) 플러스 0에서 9까지의 숫자를 허용해야합니다. 내 문제에 대해 봤 거든 두 솔루션을 발견했지만 둘 다 나를 위해 일한. 그것이 말하는 하나 개의 솔루션에서이 "터키어 문자의 사용 unicodes"Qt 정규 표현식의 터키어 문자

아래는 두 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]+$"); 

어느 reqular 표현 중 하나가 위의 유효성을 검사 할 수 있습니다 말한다 다른 하나의 "정규 표현식 터키 문자를 포함" 이름 'İSMAİL'. 또한 터키어 문자 ('ğüşöçİĞÜŞÖÇ') 만 포함 된 텍스트를 시도했지만 유효성을 확인할 수는 없습니다. 두 텍스트에서 '©'문자를 제거하면 유효성을 검사 할 수 있습니다. 문제는 'İ'캐릭터와 관련이있을 것 같습니다.

어떻게 문제를 해결할 수 있습니까?

참고 : 우리 프로젝트에서 Qt 4.6.3을 사용하고 있습니다.

+0

원본 제안을 보면, 내가 시도한 모든 regex matcher에서'^ [a-zA-Z0-9ğüşöçİĞÜŞ] + $'이 잘 작동한다 (예 : http://www.regex101.com/r/gR2xB2) . 문제가 다른 곳에 없다고 확신합니까? – mart1n

답변

14

인코딩 문제라고 생각합니다. const char*에서 QString까지의 암시 적 캐스트를 사용하면 QString::fromAscii이 사용됩니다. 여기서 Latin1이 아닌 인코딩을 사용하려면 QTextCodec::setCodecForCStrings을 호출하고 소스 파일이 저장되는 인코딩을 설정해야합니다. UTF-8 인코딩을 사용하므로 앱 초기화시 다음과 같이 수행해야합니다.

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

여기에 문제가 있는지보다 명확한 해결책을 제안합니다. UTF-8 인코딩 코드를 저장하고 명시 적으로 UTF-8을 사용 QString에 문자열 리터럴을 변환 QString::fromUtf8를 사용

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

이렇게 첫 번째 솔루션을 시도하면 true를 반환합니다. QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName ("utf-8")); exp.exactMatch ("İSMAİL"); ... '그러나 이렇게 첫 번째 솔루션을 시도하면 false를 반환합니다. QTextCodec :: setCodecForCStrings (QTextCodec :: codecForName ("utf-8")); QString name = ui.txtName-> text(); // text()가 "İSMAİL"물론 exp.exactMatch (name);을 반환합니다. 왜 이런 일이 생길까요? – onurozcelik

+0

이것을 재현 할 수 없습니다. ''İSMAİL "'을''ui.txtName-> text()'로 바꾸면 모든 것이 동일하다는 것을 확신합니까? –

+0

내 테스트 코드의 링크는 다음과 같습니다. [Test code] (http://db.tt/gwsWbbbD). 나는 "İSMAİL", "şule", "ışık"이라는 단어로 시험했으며 그 중 아무도 통과하지 못했습니다. 내가 잘못하고있는 곳을 말해줘. – onurozcelik

2

^\p{L}+$과 일치하는 문자를 사용할 수 있습니다.

1

는 대부분의 아마 당신은 \w이 필요합니다. It includes 모든 문자 (모든 언어) 숫자 및 밑줄 문자.
(?!_)\w과 같이 밑줄을 제외 할 수 있습니다.

+0

\ w는 qt 5.7에서 폴란드 문자를 지원하지 않습니다. – Adam