Radek Chalupa   konzultace a školení programování, vývoj software na zakázku

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