ccpp:locales

Podpora češtiny

Určitě se vám už stalo, že váš program měl vypsat konstantní string ve funkci printf, nebo naopak načíst nějaký vstupní text a místo toho jste dostali tzv. „rozsypaný čaj“ v podobě nesmyslných symbolů. Tento problém je způsoben tím, že řetězce v jazyce C používají pro kódování 1 bajt na znak a ve výchozím stavu tedy vychází převážně z 1. poloviny ASCII tabulky bez národnostního kódování.

Druhá polovina ASCII tabulky se pak řídí speciálním kódováním podle dané země/regionu. Z důvodu kompatibility toto naše aplikace ve výchozím stavu ignoruje. Nejjednodušší řešení je aplikaci sdělit, že chceme použít stejnou kódovací tabulku jako má nastavený systém. Ta se nastavuje typicky systémově (např. během instalace), nebo v nastavení terminálu.

Kódování ovlivňuje tzv. locale, které obsahuje pravidla pro kódování textu, formátování čísel, dat a času. Pro změnu tohoto nastavení slouží funkce setlocale z knihovny locale.h. Jazyk C má ve výchozím stavu tzv. minimální locale označené jako „C“.

Zde nastavujeme locale pro řetězce na systémové. To by mělo na všech platformách, které mají momentálně nastavenou češtinu použít správné kódování. Musíme tedy proto brát ohled na potenciální uživatele naší aplikace a případně můžeme nastavit češtinu přímo.

Díky tomu že ovlivňujeme pouze řetězce, se nemusíme bát o vstup a výstup desetinných čísel. Ten chceme u terminálových aplikaci typicky vždy s desetinnou tečkou.

#include <stdio.h>
#include <locale.h>
 
int main()
{
	char* loc = setlocale(LC_CTYPE, ""); // Prázdný řetězec představuje systémové nastavení
	printf("Locale was set to: %s\n", loc);
	printf("Příšerně žluťoučký kůň úpěl ďábelské ódy\n");
	printf("Double: %lf\n", 3.14);
 
	double d;
	puts("Zadejte desetinné číslo.");
	int dummy = scanf("%lf", &d);
	printf("%lf", d);
	return 0;
}
  • ccpp/locales.txt
  • Poslední úprava: 2020/06/15 11:02
  • autor: bures