Is there a problem with using
result = result.findAndReplace ("ü", "u");
result = result.findAndReplace ("ö", "o");
...and so on?
Edited to add:
The official UNIDATA Index is plain text. You can run it through a filter to emit a table of the needed transformations. For example,
E WITH DIAERESIS, LATIN CAPITAL LETTER 00CB
becomes
{ "\0x00CB", "E" }
As for performance: there is no magic bullet here, as there's no "translate these to those" assembly instruction, only "scan this string for that char". So that leaves you two choices, here expressed in C:
for (int n = 0; str[n]; ++n)
for (int p = 0; translateList[p]; ++p)
if (str[n] == translateList[p]->original)
{
str[n] = translateList[p]->translation;
continue;
}
for (int n = 0; translateList[n]; ++n)
{
// string.findAndReplace():
int ptr = NULL;
while (ptr = strchr(str, translate[n]->original))
*ptr = translate[n]->translation;
}
On the x86 architecture, at least, the second choice if much faster.
The real performance hit is that the string will get copied over every time, even if no substitutions are made. (In my C++ pseudocode the substitutions are made in-place.)