Hangul composition: use < base + count checks, not <= checks
Before Unicode 4.1.0 there was an error in the example code for Hangul normalization that used <= on the ends of some ranges of values, where they should have used < tests. This was faithfully copied but the need for correction has only lately come to light. Thanks to Ma Lin for pointing this out and providing the fix and test-cases. Fixes: QTBUG-71894 Pick-to: 6.2 6.1 5.15 Change-Id: I5c7fec1f9fac1f7a25b2d5e9c3109a90a7ff49e1 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
a11d1b1410
commit
182afbe335
@ -1886,7 +1886,7 @@ inline bool operator<(const UCS2SurrogatePair &ligature, uint u1)
|
||||
|
||||
static uint inline ligatureHelper(uint u1, uint u2)
|
||||
{
|
||||
if (u1 >= Hangul_LBase && u1 <= Hangul_SBase + Hangul_SCount) {
|
||||
if (u1 >= Hangul_LBase && u1 < Hangul_SBase + Hangul_SCount) {
|
||||
// compute Hangul syllable composition as per UAX #15
|
||||
// hangul L-V pair
|
||||
const uint LIndex = u1 - Hangul_LBase;
|
||||
@ -1899,7 +1899,7 @@ static uint inline ligatureHelper(uint u1, uint u2)
|
||||
const uint SIndex = u1 - Hangul_SBase;
|
||||
if (SIndex < Hangul_SCount && (SIndex % Hangul_TCount) == 0) {
|
||||
const uint TIndex = u2 - Hangul_TBase;
|
||||
if (TIndex <= Hangul_TCount)
|
||||
if (TIndex < Hangul_TCount && TIndex)
|
||||
return u1 + TIndex;
|
||||
}
|
||||
}
|
||||
|
@ -997,6 +997,25 @@ void tst_QChar::normalization_manual()
|
||||
QVERIFY(decomposed.normalized(QString::NormalizationForm_KD) == decomposed);
|
||||
QVERIFY(decomposed.normalized(QString::NormalizationForm_KC) == composed);
|
||||
}
|
||||
// QTBUG-71894 - erratum fixed in Unicode 4.1.0; SCount bounds are < not <=
|
||||
{
|
||||
// Hangul compose, test 0x11a7:
|
||||
const QChar c[] = { QChar(0xae30), QChar(0x11a7), {} };
|
||||
const QChar d[] = { QChar(0x1100), QChar(0x1175), QChar(0x11a7), {} };
|
||||
const QString composed(c, 2);
|
||||
const QString decomposed(d, 3);
|
||||
|
||||
QCOMPARE(decomposed.normalized(QString::NormalizationForm_C), composed);
|
||||
}
|
||||
{
|
||||
// Hangul compose, test 0x11c3:
|
||||
const QChar c[] = { QChar(0xae30), QChar(0x11c3), {} };
|
||||
const QChar d[] = { QChar(0x1100), QChar(0x1175), QChar(0x11c3), {} };
|
||||
const QString composed(c, 2);
|
||||
const QString decomposed(d, 3);
|
||||
|
||||
QCOMPARE(decomposed.normalized(QString::NormalizationForm_C), composed);
|
||||
}
|
||||
}
|
||||
|
||||
void tst_QChar::normalizationCorrections()
|
||||
|
Loading…
Reference in New Issue
Block a user