nie wypisuje nic

0

Mam taki kod:

#include <iostream>

//windows:
#ifdef _WIN32
void wrt(const wchar_t* text)
{
  setlocale(LC_ALL, "polish");
  std::wcout<<text;
}

//linux:
#elif defined (__unix__)
#include <cstdlib>
void wrt(const wchar_t* text)
{
  setlocale(LC_ALL, "pl_PL");
  char * dst = new char[wcslen(text)];
  wcstombs(dst, text, wcslen(text));
  std::cout<<dst;
  delete [] dst;
}
#endif

int main()
{
  wrt(L"ążźśćłóń");
}

Na windosie wszystko gra ale na linuxie nic nie wypisuje. Gdy debugowałem metodą print it to zawsze mi coś wypisywało oprócz podanego ciągu znaku. Wygląda jakby dst było puste

5
  1. locale -a - zobacz czy masz w ogóle pl_PL (btw, ISO-8859-2 czy UTF8? Wypadałoby powiedzieć które chcesz)
  2. użycie wcslen jest błędem - nie interesuje Cię ilość znaków w stringu, tylko ilość bajtów potrzebna do zapisania ich reprezentacji.
  3. nie używaj nagiego new i delete - to antyidiom w C++, masz od tego kontenery i wskaźniki.
0

Dzięki kq za rady.
Rozwiązanie:

#include <iostream>

void wrt(const wchar_t* text)
{
//windows:
#ifdef _WIN32
  setlocale(LC_ALL, "polish");
//linux:
#elif defined (__unix__)
  setlocale(LC_ALL, "C.UTF-8");
#endif
//wypisanie tekstu
  std::wcout<<text;
}

int main()
{
  wrt(L"aążźśćłóń\n");
}

Wydaje mi się że poprzedni kod nie działał bo funkcja wcstombs nie mogła przekonwertować znaków polskich do chara ze względu na to że by się nie zmieścił, ale jest to tylko moja teoria więc jak nie mam racji to niech mnie ktoś poprawi.

3

Nie działał bo używałeś nieistniejące locale. Po użyciu jakiegoś u mnie istniejącego:

[pts/1:krzaq@ArchVM:~]% cat test.cpp
#include <iostream>

//windows:
#ifdef _WIN32
void wrt(const wchar_t* text)
{
  setlocale(LC_ALL, "polish");
  std::wcout<<text;
}

//linux:
#elif defined (__unix__)
#include <cstdlib>
void wrt(const wchar_t* text)
{
  setlocale(LC_ALL, "en_US.utf8");
  char * dst = new char[wcslen(text)];
  wcstombs(dst, text, wcslen(text));
  std::cout<<dst;
  delete [] dst;
}
#endif

int main()
{
  wrt(L"ążźśćłóń");
}%
[pts/1:krzaq@ArchVM:~]% g++ test.cpp && ./a.out
ążźś%

Wypisało tyle ile dało radę zmieścić.

0

To działa na linuxie i na windosie:

#include <iostream>
int main()
{
setlocale(LC_ALL, "");
std::wcout<<L"żźćąśńóę";
}

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