Qt正则表达式中的土耳其语字符

onu*_*lik 9 regex turkish qt

我想用正则表达式验证QLineEdit的文本.它应该允许从a到z的字符加上A到Z加上土耳其字符(ğüşöçİĞÜŞÖÇ)加上0到9之间的数字.我搜索了我的问题并找到了两个解决方案,但两个都没有为我工作.在一个解决方案中它说"在regexp中包含土耳其字符",在另一个解决方案中它说"使用土耳其字符的unicodes"

下面是两个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]+$");
Run Code Online (Sandbox Code Playgroud)

上面的reqular表达式都不能验证名称'İSMAİL'.此外,我试过一个文本只包含土耳其字符('ğüşöçİĞÜŞÖÇ')但它无法验证.当我从两个文本中删除"İ"字符时,可以对其进行验证.我想问题可能与'İ'字符有关.

我该如何解决这个问题?

注意:我们在项目中使用Qt 4.6.3.

Pav*_*hov 15

我认为这是一个编码问题.您使用隐式强制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
Run Code Online (Sandbox Code Playgroud)

我建议更清楚的解决方案来检查你的问题是否在这里.以UTF-8编码保存代码,并使用QString::fromUtf8将字符串文字转换为QString明确使用UTF-8:

QRegExp exp = QRegExp(QString::fromUtf8("^[a-zA-Z0-9?ü?öç??Ü?ÖÇ]+$"));
qDebug() << exp.exactMatch(QString::fromUtf8("?SMA?L")); // <= true
Run Code Online (Sandbox Code Playgroud)