diff options
| author | Carl Hetherington <cth@carlh.net> | 2022-05-11 20:28:56 +0200 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2022-05-11 20:38:01 +0200 |
| commit | 1a721b82d4094c00ee89574e17c58c23c0de8cdd (patch) | |
| tree | ae194de02a16b8f1328c523fc5e3866449b0e49e /src | |
| parent | bbe336ee97c86c424f8f94e0f947f8e3b20e7123 (diff) | |
Tidy up careful_string_filter and add some extra transliterations.
ł seems to be ignored by the ICU transliterator for some reason.
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/util.cc | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/src/lib/util.cc b/src/lib/util.cc index d020ba13d..7d0d2bf60 100644 --- a/src/lib/util.cc +++ b/src/lib/util.cc @@ -767,19 +767,32 @@ careful_string_filter (string s) */ /* First transliterate using libicu to try to remove accents in a "nice" way */ - auto icu_utf16 = icu::UnicodeString::fromUTF8(icu::StringPiece(s)); + auto transliterated = icu::UnicodeString::fromUTF8(icu::StringPiece(s)); auto status = U_ZERO_ERROR; auto transliterator = icu::Transliterator::createInstance("NFD; [:M:] Remove; NFC", UTRANS_FORWARD, status); - transliterator->transliterate(icu_utf16); - s.clear (); - icu_utf16.toUTF8String(s); + transliterator->transliterate(transliterated); + + /* Some things are missed by ICU's transliterator */ + std::map<wchar_t, wchar_t> replacements = { + { L'ł', L'l' }, + { L'Ł', L'L' } + }; + + icu::UnicodeString transliterated_more; + for (int i = 0; i < transliterated.length(); ++i) { + auto replacement = replacements.find(transliterated[i]); + if (replacement != replacements.end()) { + transliterated_more += replacement->second; + } else { + transliterated_more += transliterated[i]; + } + } /* Then remove anything that's not in a very limited character set */ - wstring ws = boost::locale::conv::utf_to_utf<wchar_t>(s); - string out; - string const allowed = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_%.+"; - for (size_t i = 0; i < ws.size(); ++i) { - wchar_t c = ws[i]; + wstring out; + wstring const allowed = L"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_%.+"; + for (size_t i = 0; i < transliterated_more.length(); ++i) { + wchar_t c = transliterated_more[i]; if (allowed.find(c) != string::npos) { out += c; } |
