Konwersja wchar_t na basic_string

Odpowiedz Nowy wątek
2012-04-04 15:41
Moderator

Rejestracja: 10 lat temu

Ostatnio: 7 godzin temu

0

Znacie jakiś szybki sposób na konwersję jak w temacie?
Mam fragment kodu:

wchar_t wpom[30];
mbtowc(wpom, "olaboga", 10);

ati_dom::DOMString w = wpom;

Błąd wywala na ostatniej linijce (Cannot convert from 'wchar_t[30]' to 'basic_string<_Elem>').

Próbowałam kombinować o tak:

wchar_t wpom[30];
mbtowc(wpom, "olaboga", 10);

std::basic_string<wchar_t> basic_wpom(wpom);
ati_dom::DOMString w = basic_wpom;

Ale jedyne co mi to dało to: Cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'std::basic_string<_Elem>'

Pozostało 580 znaków

2012-04-04 16:06

Rejestracja: 9 lat temu

Ostatnio: 8 miesięcy temu

Lokalizacja: Kosmos

0

Cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'std::basic_string<_Elem>' wywala ci w linijce ati_dom::DOMString w = basic_wpom;?

Bez kombinowania to pętla :/


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

2012-04-04 16:14
Moderator

Rejestracja: 10 lat temu

Ostatnio: 7 godzin temu

0

@up, tak, na tej linijce.

Bez kombinowania to pętla

Jak powinna wyglądać taka pętla? Przyznam, że naprawdę nie cierpię operacji na znakach w C++, właśnie przez takie pierdoły co chwilę. Myślałam, że jak stworze zmienną typu basic_string<wchar_t>, to będzie to basic_string<_Elem>, a tymczasem robi się z tego basic_string<_Elem,_Traits,_Ax>. Jak w takim razie zadeklarować zmienną (lub rzutować?) by była basic_string<_Elem>?

Niech i będzie pętla, wpakuję to w funkcję i dodam do reszty konwertujących - w tym projekcie co i rusz jest wstringToString, charToWchar, wcharToChar i wszelkie inne możliwe przerzucanie się w te i nazad.

edytowany 1x, ostatnio: aurel, 2012-04-04 16:14

Pozostało 580 znaków

2012-04-04 16:23

Rejestracja: 9 lat temu

Ostatnio: 8 miesięcy temu

Lokalizacja: Kosmos

0

Napisałem o pętli, ale obierając teraz ziemniaki uświadomiłem sobie, że co ja gadam. Pętla tu nic nie da, pomyślałem o czym innym ;p A ten DOMString przyjmuje tylko basic_string<>? Spróbuj na wstring przekonwertować, bo wstring niby jest pochodny basic_string<>.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 1x, ostatnio: xeo545x39, 2012-04-04 16:24

Pozostało 580 znaków

2012-04-04 16:37
Moderator

Rejestracja: 10 lat temu

Ostatnio: 7 godzin temu

0

Niestety, jedyne co to dało to Cannot convert from 'std::wstring' to 'std::basic_string<_Elem>'
Pierwszy podany tu kod działał pod VS2003. Po konwersji na VS2008 zaczęła się batalia ;)

Ale, dobrze mi podpowiedziałeś z podejrzeniem definicji DOMString (o czym oczywiście nie pomyślałam wcześniej). Okazało się, że:
typedef std :: basic_string< unsigned short > DOMString;

Wygląda na to, że działa ze zwykłym rzutowaniem na usigned short:
ati_dom::DOMString w = (unsigned short *)wpom;

Pozostało 580 znaków

2012-04-04 16:45

Rejestracja: 9 lat temu

Ostatnio: 8 miesięcy temu

Lokalizacja: Kosmos

0

basic_string< unsigned short > - heh, dziwne, jakby nie mogło być char?

Jak działa to dobrze, ale raczej rzutowanie przy łańcucach nie jest wskazane.


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 1x, ostatnio: xeo545x39, 2012-04-04 16:47

Pozostało 580 znaków

Rev
2012-04-04 17:37
Rev
Moderator

Rejestracja: 13 lat temu

Ostatnio: 2 tygodnie temu

0

heh, dziwne, jakby nie mogło być char?

No tak, bo przecież unsigned short to to samo co char.

Ten kod z rzutowaniem działa, bo najzwyczajniej w świecie wywoływany jest konwertujący konstruktor basic_string, który przyjmuje wskaźnik do typu podanego w szablonie. Uważaj tylko, bo o ile na Windowsach wchar_t jest tego samego rozmiaru co unsigned short to nie jest tak wszędzie.


Oj, nie pomyślałem, że chodzi o kodowanie na 2b :| Jakoś mi się skojarzyło dziwnie. - xeo545x39 2012-04-04 17:50
Luz, ten projekt jest przeznaczony tylko dla Windowsa. Nie to, że mi się podoba to rozwiązanie, po prostu ktoś już to niestety tak napisał, ja mam to tylko doprowadzić do działania. - aurel 2012-04-04 18:17

Pozostało 580 znaków

2012-04-04 18:36

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

0

basic_string< unsigned short > - heh, dziwne, jakby nie mogło być char?

Chodzi chyba o dwubajtowe znaki, czyli powinno być basic_string<wchar_t> czyli po prostu wstring.
Ale może ten dziwny typ powstał zanim wymyślono typ wchar_t.

Prawdopodobnie zadziałałoby nawet chamskie rzutowanie z DOMString na wstring (jeśli trzeba to i reinterpret_cast).

Który dziwny typ?? - xeo545x39 2012-04-04 18:38
"The width of wchar_t is compiler-specific and can be as small as 8 bits. Consequently, programs that need to be portable across any C or C++ compiler should not use wchar_t for storing Unicode text. The wchar_t type is intended for storing compiler-defined wide characters, which may be Unicode characters in some compilers." Ogólnie to obsługa Unicode'u w C/C++ nigdy nie była najprzyjemniejsza. - Zjarek 2012-04-04 19:12
dziwny typ = basic_string<unsigned short> - Azarien 2012-04-04 19:35

Pozostało 580 znaków

2012-04-04 19:38

Rejestracja: 16 lat temu

Ostatnio: 1 godzina temu

0

The width of wchar_t is compiler-specific and can be as small as 8 bits.

Taak, taak. Ale program jest pod windowsa, a pod windowsem jest jasno ustalone, że wchar_t ma 16 bitów i przechowuje jeden „code point” kodowania UTF-16.
Pewne założenia dotyczące konkretnej platformy trzeba przyjąć.

Poza tym śmiem wątpić w poczytalność „standaryzatorów” gdy wprowadzali wchar_t jako kolejny niejasny, niesprecyzowany typ.

Pozostało 580 znaków

2012-04-04 20:35

Rejestracja: 8 lat temu

Ostatnio: 1 tydzień temu

0

Możliwe, że ten basic_string<unsigned short="short"> został stworzony ze względu na przenośność. Cechy charakterystyczne znaków dla unsigned short zostały skonkretyzowane w <iosfwd>. Oprócz nich są jeszcze konkretyzacje dla char i wchar_t. Z jakiegoś powodu musieli dołączyć jeszcze ten trzeci typ.

edytowany 1x, ostatnio: traktor90, 2012-04-04 20:36

Pozostało 580 znaków

2012-04-04 20:49

Rejestracja: 9 lat temu

Ostatnio: 7 lat temu

0

Jest jeszcze jedno rozwiązanie, skoro i tak ten kod ma nie być przenośny, ale ma działać: http://msdn.microsoft.com/en-us/library/dh8che7s(v=vs.100).aspx .

Pozostało 580 znaków

Odpowiedz

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