Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Matt91111

C++ Rozwiązywanie problemu

Rekomendowane odpowiedzi

Witam dopiero co zaczyna przygode z c++'em i napotkałem drobne problemy a mianowicie w poradniku z którego czerpie widzę nie znalazłem nic na temat jak wstawiać polskie znaki/unicode domyślam się że trzeba dodać odpowiednią biblioteke + komende... ale z tej wiedzy raczej nie wiele wynika :kwasny: i chciałbym się dowiedzieć czy bd mógł zapisywać znaki/czy "cóś" w taki ot sposób

int main()
{
   string const Plik("plik.txt");
   ofstream strumien(plik.c_str());

   if(strumien)
   {
       strumien << znaki/"cóś" ...
   }

czy trzeba bd coś zmienić... z góry dzięki ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do przechowywania polskich znaków używasz wstringa:

std::wstring w = L"string z polskimi znakami";

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Do przechowywania polskich znaków używasz wstringa:

std::wstring w = L"string z polskimi znakami";

:)

A z unicode ?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

no L to właśnie jest unikodowa wersja takiego stringa, określa jak interpretować tekst czy jednobajtowo czy dwubajtowo, czasami uzywane makro _T("jakiś tekst") - w visualu konwertuje jakiś tekst na unikod

 

unikodowa czyli jeden znak 16 bitów - 2bajty a nie jeden bajt domyślnie, zarówno biblioteka standardowa C jak i WinAPI ma dwie wersje tych samych funkcji domyślnie ANSI ale jest też wersja W np. JakaśFunkcjaA i JakaśFunkcjaW w tej pierwszej teksty ze znakami jednobajtowymi w tej drugiej szerokie(wide) ze znakami 2 bajtowymi, nie wpisuje sie A na końcu bo domyślnie wywoływane jest wersja z A, w przypadku C wyróżnienie jest bardziej jawne,

 

mysle że lepiej narazie nie bawić sie w unikod skoro dopiero zaczynasz warto wiedzieć że - to jest "równoważne" i istnieje jakby "obok" domyślnego ANSI które jest umownym sposobem kodowania znaków w 8 bitach, natomiast makro L definiuje tylko że tekst zostanie przekonwertowany na 16 bitowy unikod ;)

 

używam redefinicji takich makr w celu przeniesienia projektu z Visual C++ Embedded (gdzie jest wyłaczenie unikod - to ciekawe doświadczenie) do formatu akceptowalnego przez Borland C++ i GCC

 

#ifdef UNICODE

#define _T(s) L ## s

#define TEXT(s) L ## s

#else

#ifndef _T

#define _T(s) s

#endif

#ifndef TEXT

#define TEXT(s) s

#endif

#endif

 

Natomiast aby wstawić polskie znaki bez konwersji na unikod zamiast ść wstawiaj \xXX gdzie XX to szestnastkowo zapisany kod znaku zgodnie z ISO-8859-2 które to kodowanie przyporzadkowuje określone numerki dla okreslonych literek polskich i innych łacińskich,

 

równie dobrze cały string możesz napisać w ten sposób i bedzie mieć postać "\x68\x66\xXX", na marginesie aby wpisać znak '\' trzeba zapisać w "\\" aby wpisać tablator \t aby wpisać znak nowej linii \n\r, typowe litery - identyczne dla różnych kodowań ISOXXXX dlatego można je wpisywać bez wydziwień, specjalne znaki trzeba poprzedzać \

 

znak końca chara to zero czyli \x00 litera A litera a różni jeden bit ma kod 41 i 61(hex) czyli ok 100 decymalnie,zatem zmiana dużych na małe litery sprowadza sie do manipulacji określonym bitem, numerki 1,2,3 itd wcale nie maja kodu 1,2,3 ale odległe 30(hex)

 

http://pl.wikipedia.org/wiki/ASCII

http://pl.wikipedia.org/wiki/Kodowanie_polskich_znak%C3%B3w

 

jeśli chcesz zoabaczyć jaka jest różnica miedzy jednobajtowymi charami a dwubajtowymi wcharami to odpal edytor HEX i plik tekstowy zapisany w notatniku, tam również podejrzysz kody dla znaków jakie chcesz, zapisz to samo w notatniku jako jako klasyczny ascii lub unikod zobaczysz róznice(w wyborze nazwy pliku jest wybór kodowania)

 

 

 

http://pl.wikibooks.org/wiki/C/Napisy

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

możesz też użyć takiej funkcji

 

std::string text_PL(std::string Znak)
{
   for (unsigned int i = 0; i < Znak.length(); i++)
      {
              switch(Znak[i])
              {
                      case 'ą':
                              Znak[i] = static_cast<char>(165);
                      break;

                      case 'ć':
                              Znak[i] = static_cast<char>(134);
                      break;

                      case 'ę':
                              Znak[i] = static_cast<char>(169);
                      break;

                      case 'ł':
                              Znak[i] = static_cast<char>(136);
                      break;

                      case 'ń':
                              Znak[i] = static_cast<char>(228);
                      break;

                      case 'ó':
                              Znak[i] = static_cast<char>(162);
                      break;

                      case 'ś':
                              Znak[i] = static_cast<char>(152);
                      break;

                      case 'ź':
                              Znak[i] = static_cast<char>(171);
                      break;

                      case 'ż':
                              Znak[i] = static_cast<char>(190);
                      break;

                      case 'Ą':
                              Znak[i] = static_cast<char>(164);
                      break;

                      case 'Ć':
                              Znak[i] = static_cast<char>(143);
                      break;

                      case 'Ę':
                              Znak[i] = static_cast<char>(168);
                      break;

                      case 'Ł':
                              Znak[i] = static_cast<char>(157);
                      break;

                      case 'Ń':
                              Znak[i] = static_cast<char>(227);
                      break;

                      case 'Ó':
                              Znak[i] = static_cast<char>(224);
                      break;

                      case 'Ś':
                              Znak[i] = static_cast<char>(151);
                      break;

                      case 'Ź':
                              Znak[i] = static_cast<char>(141);
                      break;

                      case 'Ż':
                              Znak[i] = static_cast<char>(189);
                      break;
                      case '°':
                              Znak[i] = static_cast<char>(248);
                      break;
              }
      }
      return Znak;
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...