CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - c_str() AnsiString w_str() UnicodeString - konwersja

c_str() AnsiString w_str() UnicodeString - konwersja

dział ogólny

c_str() AnsiString w_str() UnicodeString - konwersja

Nowy postprzez lukagrom » niedziela, 2 lutego 2020, 17:32

Temat był wałkowany kilkakrotnie, sprowadzał się do tego, że wraz z nowszymi wersjami wymógł tekstowy w środowisku poszedł na UnicodeString, a zmienne char, sukcesywnie są wymienione, na rzecz wchar_t. Jednakże przetrwało kilka starszych funkcji (np procesy), które nijak nie da się zaprzązć pod działanie pary - wchar_t - w_str(), a jakiś zamiennik do nowych typów dotychczas nie powstał. Jednak naprzeciw wychodzi liberalne podejście środowiska do zamiany pomiędzy nowszymi i starszymi typami znakowymi i tekstowymi. Przez przypadek doszedłem do takich "dziwactw?", najłatwiej będzie pokazać za pomocą kopiowania.
KOD cpp:     UKRYJ  
wchar_t wtab1[64],wtab2[64];
char tab1[64],tab2[64];
wcscpy(wtab1,Edit1->Text.w_str());
 

Kopiować również można z c_str(), bo w nowszym śródowisku (nie wiedzieć czemu) zwraca *wchar_t. Czyli:
KOD cpp:     UKRYJ  
 wcscpy(wtab2,Edit1->Text.c_str());
 

Jednakże już na type char takie coś nie przejdzie:
KOD cpp:     UKRYJ  
 strcpy(tab1,Edit1->Text.c_str());
 

Co zrobić gdy właśność tekstu z komponentu przekiopować do tablicy char? Prosty zabieg z użyciem AnsiString:
KOD cpp:     UKRYJ  
 AnsiString temp_A;
 temp_A=Edit1->Text;
 strcpy(tab1,temp_A.c_str());
 

Po drugiej stronie równania, także środowisko zapewnia dowolność konwersji:
KOD cpp:     UKRYJ  
  Label1->Caption=AnsiString(wtab1);
  Label2->Caption=UnicodeString(wtab1);
  Label3->Caption=AnsiString(tab1);
  Label4->Caption=UnicodeString(tab1);
 

Tak więc o ile ktoś potrzebuje na siłę wcisnąć jakiś kod bazujący na starszych typach, ściągnąć jakaś archaiczną funkcję z C bazującą na char, to idzie to jakoś w miarę łatwo w nowszej wersji dokonać.
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: c_str() AnsiString w_str() UnicodeString - konwersja

Nowy postprzez polymorphism » niedziela, 2 lutego 2020, 21:00

Nie widzę pytania. To wątek z poradą?
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: c_str() AnsiString w_str() UnicodeString - konwersja

Nowy postprzez lukagrom » niedziela, 2 lutego 2020, 22:28

Rzeczywiście zabrakło pytania. W sumie można retorycznie tylko zapytać, że dobrze, że występują ułatwienia i funkcję wewnętrzne typu w_str() (zapożyczone z Delphi), które znacząco skracają i ułatwiają "zabawe" z typem wchar_t, jak i dają możliwość przeskakiwania w zależności od sytuacji, do miejsc gdzie nagle potrzebna jest para -char - str().
Ze strony referencyjnej C++, gdyby trzeba było przypisać String do wchar_t to wygląda to dużo karkołomniej z swprintf:
KOD cpp:     UKRYJ  
String t_Label=Label1->Caption;
 const size_t width=t_Label.Length()+1;
 wchar_t *buff_W=new wchar_t[width];
 swprintf(buff_W,width,L"%s",t_Label.c_str());
 Edit3->Text=String(buff_W);

 

U mnie buff_W jest dynamiczne, na stronie z przykładem - wchar_t buff_W[width] - chyba gestia kompilatora, bo mój wywala wtedy błąd - [Constant expression required.
Reasumując. Czy pochodzące od Embarcadero w_str() i inne podobne wynazlazki są dobre? Wszystko wskazuje na to, że jak najbardziej.
Avatar użytkownika
lukagrom
Intelektryk
Intelektryk
 
Posty: 123
Dołączył(a): wtorek, 1 stycznia 2013, 14:54
Podziękował : 9
Otrzymał podziękowań: 5
System operacyjny: Windows Vista
Kompilator: C++ Builder 10.1 Starter
Gadu Gadu: 0
    Windows VistaChrome

Re: c_str() AnsiString w_str() UnicodeString - konwersja

Nowy postprzez polymorphism » niedziela, 2 lutego 2020, 23:11

(...) na stronie z przykładem - wchar_t buff_W[width] - chyba gestia kompilatora, bo mój wywala wtedy błąd - [Constant expression required.

W C++ VLA są niedozwolone, dlatego width nie może być zmienną - to jest słuszny powód błędu.

g++ dopuszcza VLA, ale to jest niezgodne ze standardem C++ i taki kod jest nieprzenośny (i niebezpieczny).

Czy pochodzące od Embarcadero w_str() i inne podobne wynazlazki są dobre?

Przy takiej konwersji wide -> narrow trzeba pamiętać, że nie wszystkie znaki da się przekonwertować, dlatego zawsze warto poszukać unikodowych wersji funkcji.

wchar_t *buff_W=new wchar_t[width];

Nie zwalniasz tej pamięci nigdzie. Z uporem maniaka po raz n-ty powtórzę: ręczne zarządzanie pamięcią w C++ to w 90% przypadków błąd projektowy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2263
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 210
System operacyjny: Windows 8.1
Windows 10
Linux Mint 19
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    UbuntuFirefox

Re: c_str() AnsiString w_str() UnicodeString - konwersja

Nowy postprzez mateusznowakpl » wtorek, 24 marca 2020, 20:49

Zgadzam się z tym co napisał polymorphism - nie powinno się w C++ zarządzać pamięcią ręcznie! Zwolnij pamięc. :)
Tworzę oprogramowanie dla firm oraz platformy b2b dla firm w CodingIsThinking.
Prowadzę również sklep internetowy z meblami oferujący m.in: stoliki kawowe, fotele tapicerowane oraz krzesła, np - krzesło margo. Sprawdź ofertę na mrdecor.pl
Avatar użytkownika
mateusznowakpl
Bladawiec
Bladawiec
 
Posty: 2
Dołączył(a): środa, 4 marca 2020, 21:12
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: Ubuntu
Kompilator: PHP
SKYPE: wisewebpl
    LinuxChrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 21 gości

cron