path: root/src/corelib/tools/qcollator_win.cpp
diff options
authorEdward Welbourne <>2018-10-02 19:02:29 +0200
committerEdward Welbourne <>2018-12-11 19:05:07 +0000
commitab448f731ecd8437c7c5c8b96a0e7f419ec3a7ca (patch)
treefd92aef03d376177364253beddd3e74ce7ad2715 /src/corelib/tools/qcollator_win.cpp
parent63b0eb3a89049f3a9166a29e8c8275d77323ec52 (diff)
Handle QCollator with locale C by delegating to QString
Previously, the C locale was treated as English because each back-end takes the locale's bcp47Name(), which maps C to en. However, the C locale has its own rules; which QString helpfully implements; so we can delegate to it in this case. Extended this to sort keys, where possible. Clean up existing implementations in the process. Extended tst_QCollator::compare() with some cases to check this. That required wrapping the test's calls to in a sign canonicalizer, since it can return any -ve for < or +ve for >, not just -1 and +1 for these cases (and it'd be rash to hard-code specific negative and positive values, as they may vary between backends). [ChangeLog][QtCore][QCollator] Added support for collation in the C locale, albeit this is only well-defined for ASCII. Collation sort keys remain unsupported on Darwin. Fixes: QTBUG-58621 Change-Id: I327010d90f09bd1b1816f5590cb124e3d423e61d Reviewed-by: Thiago Macieira <>
Diffstat (limited to 'src/corelib/tools/qcollator_win.cpp')
1 files changed, 7 insertions, 0 deletions
diff --git a/src/corelib/tools/qcollator_win.cpp b/src/corelib/tools/qcollator_win.cpp
index 5a838c1b50..35142bb8b8 100644
--- a/src/corelib/tools/qcollator_win.cpp
+++ b/src/corelib/tools/qcollator_win.cpp
@@ -60,6 +60,8 @@ extern LCID qt_inIsoNametoLCID(const char *name);
void QCollatorPrivate::init()
collator = 0;
+ if (isC())
+ return;
localeID = qt_inIsoNametoLCID(QLocalePrivate::get(locale)->bcp47Name().constData());
@@ -86,6 +88,9 @@ void QCollatorPrivate::cleanup()
int QCollator::compare(const QChar *s1, int len1, const QChar *s2, int len2) const
+ if (d->isC())
+ return QString::compare_helper(s1, len1, s2, len2, d->caseSensitivity);
if (d->dirty)
@@ -119,6 +124,8 @@ QCollatorSortKey QCollator::sortKey(const QString &string) const
if (d->dirty)
+ if (d->isC())
+ return QCollatorSortKey(new QCollatorSortKeyPrivate(string));
int size = LCMapStringW(d->localeID, LCMAP_SORTKEY | d->collator,