Jak v C++ s GLib odstranit diakritiku z textu?
29.12.2018
Jsou situace kdy chceme z textu odstranit diakritiku, samozřejmě nikoliv ve smyslu odebrání/smazání "ne-ansi" znaků, ale nahrazení znaků s diakritikou jejich odpovídajícím "základem".
Jistě by si každý jen trochu zkušený programátor dokázal napsat vlastní algoritmus s využitím pole dvojic znaků, ale zde si ukážeme 2 způsoby s využitím již hotových funkcí v Linuxovém prostředí.
Pokud chceme a můžeme v aplikaci využít knihovnu GLib, je řešení velmi jednoduché. Použijeme funkci g_str_to_ascii a jediné na co nesmíme zapomenout je po použití uvolnit vrácený pointr funkcí g_free, jak je vidět v následujícím výpisu ukázkové aplikace:
#include <stdlib.h>
#include <stdio.h>
#include <locale.h>
#include <glib-2.0/glib.h>
#include <string>
std::string konverze_na_ascii(const char* text,
bool zobraz = true)
{
if (zobraz)
printf("%s\n", (char*)text);
gchar* vystup = g_str_to_ascii(text, NULL);
if (!vystup)
{
perror("chyba g_str_to_ascii");
return std::string("");
}
if (zobraz)
printf("%s\n", (char*)vystup);
std::string str_vyst = (char*)vystup;
g_free(vystup);
return str_vyst;
}
int main(int argc, char const *argv[])
{
std::string str =
konverze_na_ascii("Nějaký český text.€.$.@.ěščřžýáíé.#.ĚŠČŘŽÝÁÍÉ");
printf("pro kontrolu: %s", str.c_str());
getchar();
return 0;
}
Vzhledem k tomu že využíváme knihovnu GLib, musíme při překladu a sestavení nastavit kompilátoru cestu k hlavičkovým souborům a linkeru pak příslušné knihovny. To můžeme udělat jednoduše použitím pkg-config, takže debug sestavení vytvoříme takto:
g++ maing.cpp -Wall -g -std=c++17 `pkg-config --cflags --libs glib-2.0` -oaplikace