feat(tools): support UTF-8 characters in autocompletion

Autocompletion failed for nicknames using non Latin scripts. We used
`g_str_to_ascii`, which replaces characters it cannot transliterate with
'?', leading search failures and false matches between different
scripts.

Now we do:
Use `g_utf8_casefold` for case-insensitive UTF-8 comparison. This
ensures that like 'Σ' correctly match 'σ' across all Unicode scripts,
providing correct results for non English nicknames.

If we don't fine anything typing a base ASCII character matches an
accented one (typing `e` matches `è`). This pass uses `g_str_to_ascii`
followed by `g_ascii_strdown` for comparison. It is now restricted to
run if the search string itself is valid ASCII, preventing the
"everything matches '?'" bug in non Latin scripts.

Autocomplete items are sorted using `strcmp`. `g_utf8_collate` provides
linguistical ordering for a specific language. But its behavior is
locale dependent and undefined when comparing strings from different
scripts. `strcmp` does byte-wise ordering that correctly follows Unicode
code order for UTF-8 strings.
This commit is contained in:
Michael Vetter
2026-03-19 08:22:08 +01:00
parent 9de455ceea
commit e9c6b3b3d8
10 changed files with 238 additions and 5 deletions

View File

@@ -27,6 +27,7 @@
#include "test_software.h"
#include "test_muc.h"
#include "test_disconnect.h"
#include "test_i18n.h"
#define PROF_FUNC_TEST(test) cmocka_unit_test_setup_teardown(test, init_prof_test, close_prof_test)
@@ -116,6 +117,9 @@ main(int argc, char* argv[])
PROF_FUNC_TEST(shows_no_message_in_console_when_window_not_focussed),
PROF_FUNC_TEST(disconnect_ends_session),
PROF_FUNC_TEST(i18n_msg_nickname),
PROF_FUNC_TEST(i18n_win_nickname),
};
return cmocka_run_group_tests(all_tests, NULL, NULL);