[C/C++] Konvertera WCHAR till std::string / char*

Permalänk
Hedersmedlem

[C/C++] Konvertera WCHAR till std::string / char*

Jag har kört fast på det här rejält nu, har testat massor med olika lösningar. Någon som har kod som verkligen fungerar?

Just nu har jag denna, som bara ger ett mellanslag eller helt tomt.

wchar_t *wArtist = new wchar_t[1024]; wchar_t *wTitle = new wchar_t [1024]; wmemset(wArtist, 0, 1024); wmemset(wTitle, 0, 1024); int n = (int)SendMessage(QCDPlayer::GetHandle(), (WM_USER+1024), (WPARAM)wArtist, 1023); int n2 = (int)SendMessage(QCDPlayer::GetHandle(), (WM_USER+1026), (WPARAM)wTitle, (LPARAM)1023); char *Artist = new char [n+2]; memset(Artist, 0, n+2); wcstombs(Artist, wArtist, n+1); return std::string(Artist);

Målet är alltså att göra om wArtist/wTitle till något som man kan lägga ihop tillsammans i en std::string.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Re: [C/C++] Konvertera WCHAR till std::string / char*

Citat:

Ursprungligen inskrivet av Thomas
Målet är alltså att göra om wArtist/wTitle till något som man kan lägga ihop tillsammans i en std::string.

Du skulle ju kunna köra std::wstring, men då måste du också köra unicode i hela ditt program.

Permalänk
Medlem

Kan inte C++ och förstår knappt frågan, men kanske WideChartoMultiByte?

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Hedersmedlem

Nu är det bara det att sourcekoden är 73kB totalt (*.cpp, *.h) så jag tänker inte skriva om det till unicode först nu.

Ska testa WideChar...igen, tror jag redan gjort det dock.

Edit: Detta funkar inte heller:

WideCharToMultiByte(CP_OEMCP,0,wArtist,-1,Artist,n+1,0,0);

Blir fortfarande bara tomt. Jag tror fortfarande delvis på att det är QCD Player's fel, men den returnerar alltid rätt längd på strängarna (n / n2) så man undrar ju...

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

1. Ha inte så bråttom. Det här är helt klart något du inte kan så varför inte ta chansen och lära sig?

http://www.joelonsoftware.com/articles/Unicode.html

2. Kolla upp std::ctype (widen/narrow).

Permalänk
Hedersmedlem

Förra gången jag kollade var för nån månad sen, bråttom javisst.
Gav upp efter några timmar då (3-4 timmar effektivt kanske) och aningen snabbare nu eftersom jag inte hittade några bättre metoder.

Läste igenom den där nu, och jag kan inte påstå att jag lärde mig något. Jag tycker nog att jag kan en del om det här, däremot så har ingen aning om vad det är för encoding eller så på strängen, enbart att det är WCHAR som gäller för den... Jag trodde däremot att det sa allt som behövdes.

Ska kolla upp ctype vad det nu är, återkommer.

Edit: Fattar ändå inte.

wchar_t y[] = L"Hello"; char z = std::wcout.narrow(y[0]); return std::string(1,z);

Det där funkar. y[0] ger 'H', y[1] ger 'e' osv... Men om jag byter ut y[0] mot wArtist[0] så blir det ingenting alls, bokstavligt talat (inte ens det som ska komma efter kommer med, som om det blir null eller nåt).

Edit: Det är det också, givetvis... Standard att returnera om den inte lyckas. Vafan.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

Prova det här.

const char UNKNOWN_CHAR = '#'; void convert(const string& src, wstring& dest) { const ctype<wchar_t> &ct = use_facet< ctype<wchar_t> >(locale()); dest.resize(src.size()); ct.widen(src.data(), src.data() + src.size(), &dest[0]); } void convert(const wstring& src, string& dest) { const ctype<wchar_t> &ct = use_facet< ctype<wchar_t> >(locale()); dest.resize(src.size()); ct.narrow(src.data(), src.data() + src.size(), UNKNOWN_CHAR, &dest[0]); }

Är glad för att jag lade C++ på hyllan...

Permalänk
Hedersmedlem

Tackar!
Det fungerar dock inte heller, men nu är jag 100% säker på att det inte är konverteringens fel utan strängens - din (och min gamla) kod funkar på "egna" strängar men inte på de jag ska göra om.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200