Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Miten luetaan terminaalista UTF-8-merkkejä?

Reol [15.02.2017 18:59:46]

#

Hei,
Yritän lukea terminaalista merkkejä, jotka ovat utf-8 muodossa, tarvitsisin sitten pystyä vertaamaan niitä keskenään, merkki kerralaan, jotta voin tarkistaa onko annettu syöte palindromi.
Olen ymmärtänyt, että char32_t tyyppiä voinee käyttää? char antaisi vain 8 bittisiä merkkejä utf-8:n useampi bittisten merkkejen sijaan.
Koodi tällä hetkellä on, mutta valitettavasti se ei toimi. strlen ja scanf ei tue char32_t ?

char32_t input[150];
   printf("This is a palindrome checker, type a text and press RET\n");
   scanf("%s", input);

   int i;
   int j = strlen(input) - 1;
   for(i=0;  i<j; i++, --j){
        if(input[i]!=input[j]){
           printf("It is not a palindrome\n");
           return (0);
        }

    }

    printf("It is a palindrome\n");
    return (0);

Metabolix [16.02.2017 17:37:31]

#

Yksi vaihtoehto on käyttää wchar_t-tyyppiä. Sen käyttö edellyttää, että oikea merkistö (UTF-8) on saatu käyttöön setlocale-funktiolla. Linuxissa sopivat parametrit setlocale-funktiolle löytyvät yleensä ympäristömuuttujista. Windowsista en osaa suoralta kädeltä sanoa, mutta siellähän UTF-8-tuki on ylipäänsä epämääräisempi.

// gcc -Wall -pedantic -std=c11
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main(void) {
	// Asetetaan käyttäjän ympäristömuuttujien mukainen LC_CTYPE.
	setlocale(LC_CTYPE, getenv("LANG"));
	setlocale(LC_CTYPE, getenv("LC_CTYPE"));
	setlocale(LC_CTYPE, getenv("LC_ALL"));

	// Luetaan enintään 15:n koodipisteen sana.
	wchar_t sana[2][16];
	scanf("%15ls", sana[0]);

	// Käännetään sana.
	int len = wcslen(sana[0]);
	for (int i = 0; (sana[1][len-i-1] = sana[0][i]) != 0; ++i);

	printf("sana: %ls, pituus: %d, käännettynä: %ls\n", sana[0], len, sana[1]);
}

Usein on kylläkin käytännöllistä säilyttää UTF-8-muotoinen teksti tavallisessa char-taulukossa ja käyttää erillisiä algoritmeja niihin harvoihin tapauksiin, joissa sitä tarvitsee oikeasti käsitellä koodipiste kerrallaan.

char32_t ei kuulu C:hen vaan C++:aan.

Reol [18.02.2017 15:46:21]

#

Kiitos vinkeistä! Sain toimimaan tuon wchar_t tyypin kanssa haluamallani tavalla.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta