OSMAND_CORE_API QString OSMAND_CORE_CALL OsmAnd::ICU::transliterateToLatin(const QString& input) { QString output; UErrorCode icuError = U_ZERO_ERROR; bool ok = true; const auto pTransliterator = g_pIcuTransliterator->clone(); if(pTransliterator == nullptr || !U_SUCCESS(icuError)) { LogPrintf(LogSeverityLevel::Error, "ICU error: %d", icuError); if(pTransliterator != nullptr) delete pTransliterator; return input; } UnicodeString icuString(reinterpret_cast<const UChar*>(input.unicode()), input.length()); pTransliterator->transliterate(icuString); output = qMove(QString(reinterpret_cast<const QChar*>(icuString.getBuffer()), icuString.length())); if(pTransliterator != nullptr) delete pTransliterator; if(!ok) { LogPrintf(LogSeverityLevel::Error, "ICU error: %d", icuError); return input; } return output; }
OSMAND_CORE_API QString OSMAND_CORE_CALL OsmAnd::ICU::transliterateToLatin( const QString& input, const bool keepAccentsAndDiacriticsInInput /*= true*/, const bool keepAccentsAndDiacriticsInOutput /*= true*/) { QString output; UErrorCode icuError = U_ZERO_ERROR; bool ok = true; const auto pAnyToLatinTransliterator = g_pIcuAnyToLatinTransliterator->clone(); if (pAnyToLatinTransliterator == nullptr || U_FAILURE(icuError)) { LogPrintf(LogSeverityLevel::Error, "ICU error: %d", icuError); if (pAnyToLatinTransliterator != nullptr) delete pAnyToLatinTransliterator; return input; } // Transliterate from any to latin UnicodeString icuString(reinterpret_cast<const UChar*>(input.unicode()), input.length()); pAnyToLatinTransliterator->transliterate(icuString); output = qMove(QString(reinterpret_cast<const QChar*>(icuString.getBuffer()), icuString.length())); // If input and output differ at this point or accents/diacritics should be converted, // normalize the output again if ((input.compare(output, Qt::CaseInsensitive) != 0 || !keepAccentsAndDiacriticsInInput) && !keepAccentsAndDiacriticsInOutput) { const auto pIcuAccentsAndDiacriticsConverter = g_pIcuAccentsAndDiacriticsConverter->clone(); ok = pIcuAccentsAndDiacriticsConverter != nullptr && U_SUCCESS(icuError); if (ok) { pIcuAccentsAndDiacriticsConverter->transliterate(icuString); output = qMove(QString(reinterpret_cast<const QChar*>(icuString.getBuffer()), icuString.length())); } if (pIcuAccentsAndDiacriticsConverter != nullptr) delete pIcuAccentsAndDiacriticsConverter; } if (pAnyToLatinTransliterator != nullptr) delete pAnyToLatinTransliterator; if (!ok) { LogPrintf(LogSeverityLevel::Error, "ICU error: %d", icuError); return input; } return output; }