Самый простой способ (для меня) состоит в том, чтобы просто поддерживать массив разреженных отображений, который просто превращает ваши кодовые точки Unicode в отображаемые строки.
Например:
start = 0x00C0
size = 23
mappings = {
"A","A","A","A","A","A","AE","C",
"E","E","E","E","I","I","I", "I",
"D","N","O","O","O","O","O"
}
start = 0x00D8
size = 6
mappings = {
"O","U","U","U","U","Y"
}
start = 0x00E0
size = 23
mappings = {
"a","a","a","a","a","a","ae","c",
"e","e","e","e","i","i","i", "i",
"d","n","o","o","o","o","o"
}
start = 0x00F8
size = 6
mappings = {
"o","u","u","u","u","y"
}
: : :
Использование массива sparse позволит вам эффективно представлять замены, даже если они находятся в широко разнесенных разделах таблицы Unicode. Замена строк позволит произвольным последовательностям заменить ваши диакритические знаки (например, æ
превращается в ae
).
Это ответ, не зависящий от языка, поэтому, если вы имеете в виду конкретный язык, найдутся лучшие способы (хотя в любом случае они все, вероятно, дойдут до этого на самых низких уровнях).