Prefer ICU to transliterate characters when available

Fixes #1008
This commit is contained in:
Jonas Kvinge
2022-07-28 04:01:58 +02:00
parent 538c759fef
commit 564211aceb
17 changed files with 95 additions and 19 deletions

View File

@@ -23,7 +23,12 @@
#include <memory>
#include <cstdlib>
#include <iconv.h>
#ifdef HAVE_ICU
# include <unicode/translit.h>
#else
# include <iconv.h>
#endif
#include <QtGlobal>
#include <QApplication>
@@ -786,16 +791,39 @@ QString DesktopEnvironment() {
}
QString UnicodeToAscii(const QString &unicode) {
#ifdef HAVE_ICU
QString Transliterate(const QString &accented_str) {
UErrorCode errorcode = U_ZERO_ERROR;
std::unique_ptr<icu::Transliterator> transliterator;
transliterator.reset(icu::Transliterator::createInstance("Any-Latin; Latin-ASCII;", UTRANS_FORWARD, errorcode));
if (!transliterator) return accented_str;
QByteArray accented_data = accented_str.toUtf8();
icu::UnicodeString ustring = icu::UnicodeString(accented_data.constData());
transliterator->transliterate(ustring);
std::string unaccented_str;
ustring.toUTF8String(unaccented_str);
return QString::fromStdString(unaccented_str);
}
#else
QString Transliterate(const QString &accented_str) {
#ifdef LC_ALL
setlocale(LC_ALL, "");
#endif
iconv_t conv = iconv_open("ASCII//TRANSLIT", "UTF-8");
if (conv == reinterpret_cast<iconv_t>(-1)) return unicode;
if (conv == reinterpret_cast<iconv_t>(-1)) return accented_str;
QByteArray utf8 = unicode.toUtf8();
QByteArray utf8 = accented_str.toUtf8();
size_t input_len = utf8.length() + 1;
char *input_ptr = new char[input_len];
@@ -817,8 +845,11 @@ QString UnicodeToAscii(const QString &unicode) {
delete[] output_ptr;
return ret;
}
#endif
QString MacAddress() {
QString ret;

View File

@@ -132,7 +132,7 @@ QString GetRandomString(const int len, const QString &UseCharacters);
QString DesktopEnvironment();
QString UnicodeToAscii(const QString &unicode);
QString Transliterate(const QString &accented_str);
QString MacAddress();