Próba „przekonwertowania ich wszystkich” jest niewłaściwym podejściem do problemu.
Po pierwsze, musisz zrozumieć ograniczenia tego, co próbujesz zrobić. Jak inni zauważyli, znaki diakrytyczne istnieją z jakiegoś powodu: są to zasadniczo unikalne litery w alfabecie tego języka z własnym znaczeniem / dźwiękiem itp.: Usuwanie tych znaków jest tym samym, co zastępowanie przypadkowych liter w angielskim słowie. To jest jeszcze zanim przejdziesz do rozważenia języków cyrylicy i innych tekstów opartych na pismach, takich jak arabski, których po prostu nie da się „przekonwertować” na angielski.
Jeśli z jakiegoś powodu musisz przekonwertować postacie, to jedyny rozsądny sposób podejścia do tego, aby najpierw zmniejszyć zakres wykonywanego zadania. Weź pod uwagę źródło danych wejściowych - jeśli kodujesz aplikację dla „świata zachodniego” (aby użyć tak dobrego wyrażenia, jak inne), byłoby mało prawdopodobne, że kiedykolwiek będziesz musiał analizować znaki arabskie. Podobnie zestaw znaków Unicode zawiera setki symboli matematycznych i obrazkowych: nie ma (łatwego) sposobu, aby użytkownicy mogli je bezpośrednio wprowadzić, więc można założyć, że można je zignorować.
Wykonując te logiczne kroki, można zmniejszyć liczbę możliwych znaków do przeanalizowania do punktu, w którym operacja wyszukiwania / zamiany w oparciu o słownik jest wykonalna. Tworzenie słowników staje się wtedy niewielką ilością nieco nudnej pracy, a ich zastąpienie staje się banalnym zadaniem. Jeśli twój język obsługuje natywne znaki Unicode (tak jak Java) i poprawnie optymalizuje struktury statyczne, takie wyszukiwanie i zamiany są zwykle niezwykle szybkie.
Wynika to z doświadczenia związanego z pracą nad aplikacją, która była wymagana, aby umożliwić użytkownikom końcowym wyszukiwanie danych bibliograficznych zawierających znaki diakrytyczne. Stworzenie tablic wyszukiwania (tak jak to było w naszym przypadku) zajęło około 1 osobodni, aby pokryć wszystkie znaki diakrytyczne dla wszystkich języków zachodnioeuropejskich.