Zamiana małych liter na duże

0

Jak w C++ można zamienić małe litery na duże w stringu? Oczywiście mówię o znakach międzynarodowych (mam w dupie to, że amerykańce sobie wymyśliły, że litery to tylko a-z... "ę" to również litera). Czy nie ma na to normalnego sposobu? Czy muszę korzytać z jakichś kosmicznych funkcji takich jak te tutaj http://gcc.gnu.org/ml/gcc-help/2005-12/msg00074.html (jakieś MyToUpper, MyToLower)? Albo czy muszę stosować zewnętrzne biblioteki takie jak ta http://library.gnome.org/devel/glib/stable/glib-Unicode-Manipulation.html#g-utf8-strup ? Czy naprawdę w C++ nie da się normalnie, bez cudowania zamienić "źdźbło" na "ŹDŹBŁO"? Czego Wy używacie do tego celu?

Programuję na platformie linuxowej.

P.S. Przepraszam za ton, ale problem jest banalny, a ja już od wielu godzin szukam sensownego rozwiązania i nie mogę znaleźć.

0

Nie rozumiem o czym mówisz, chcesz używać funkcji zawierającej duże litery?

0

@up CZYTAJ!!

Jak w C++ można zamienić małe litery na duże w stringu?

Musisz zobaczyć jakie liczby mają przypisane poszczególne znaki i napisać własną funkcję.

0

Właśnie o to pytam. Nie wierzę, żeby nie było czegoś gotowego. Nie chcę wyważać otwartych drzwi i pisać swoich funkcji do tego prostego celu. Ja chcę tylko zamienić małe litery na duże. Czy to naprawdę taki problem w C++?

0

Jak widać tak, bo nikt nie pomyślał o nas Polakach. W dziedzinie inf. niepodzielnie rządzi ang. więc jak coś ma być dla j. polskiego to trzeba to zrobić samemu.

0

Ustaw locale na polskie i będzie działać...

0

Ale jak to w ogóle zrobić? Tak?

        setlocale(LC_CTYPE, "pl_PL.UTF-8");
        string s = "Robiński";

        for(int i = 0; i < s.length(); i++)
        {
          s[i] = toupper(s[i]);
        }

        cout << s <<endl;

Nie działa. Zwraca "ROBIńSKI".

0

A co tam robi to utf-8? Bo jeśli chodzi o kodowanie ANSI to:

setlocale(LC_CTYPE,""); //<--- systemowe
//lub np.
setlocale(LC_CTYPE,".1250"); 

A jeśli w string'u masz unikod, to ta pętla jest zła, bo nie uwzględnia wielobajtowych znaków. Już nie wspominając o toupper...

0

Użyj std::toupper(znak, lokalka)...

@down: toupper z lokalką jest prostsze i fajniejsze.

0

ja bym proponował coś takiego:

#define ROZNICA ('a'-'A')

void UpCharachers(const char* str,size_t size)
{
  for(size_t i=0; i < size; i++)
  {
    if(str[i]>'a' && str[i]<'z') str[i]-=ROZNICA; //standardowo
    else
    {
      if(str[i]=='ą') str[i]='Ą';
      else if(str[i]=='ę') str[i]='Ę';
      else if(itd.
    }
  }
}

dopóki używasz takiego kodowania znaków, jakie masz w IDE, będzie ok
jakbyś chciał robić bardziej uniwersalnie, na dane dostarczanie zewnętrznie z różnymi możliwościami kodowania musiałbyś zrobić tablice z dla różnych stron kodowych, w których byś miał informacje jaką wartość przekształcać na jaką

0

@_0x666_:
Tak, jak napisałem w pierwszym poście, chcę użyć znaków międzynarodowych. Co to jest? Średniowiecze, żeby po łacinie pisać? Unikod jest dzisiaj standardem, a "ą" jest taką samą literą jak "ä" czy "á" czy zwykłe łacińskie "a".

@manfredek:
Czy toupper nie działa tylko dla pojedynczych znaków? Jak mu przekazać znak dwubajtowy?

0

Eh. toupper z <locale> jest wzorcem, przyjmuje 1 parametr - typ znaku i 2 argumenty: znak (typu takiego samego jak parametr, char, wchar_t i co jeszcze wymyślą) i lokalkę. Sam sobie odpowiedz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1