[c++/std] czytanie do stringa z pliku unicode

0

Witam,
chcialem wyciągnąć kilka rzeczy z pliku xml.
Rzecz w tym że pobierana linijka przez getline() do stringa ma puste pole między każdymi dwoma literami.
Coś mi świta, że może chodzi o typy wide narrow stringów,
ale w dokumentacji std string nic nie znalazlem o ustawieniach.

Jeśli to wina tych typów czy kodowania, to czy da się to jakoś ominąć przy ładowaniu pliku?
Albo jakoś elegancko czy musze grzebać za jakimiś widestringami i konwertować wszystko jak leci?
Nigdy wcześniej mi się takie coś nie pojawiło...

Nie sądze żeby jakiś robak był w kodzie:
http://rafb.net/p/au4Lms57.html

VS 8

0

To chyba sprawa kodowania. Pliki xml są w Unicode a std::strumienie mają bodajże ASCII.
Musiałbyś znaleźć jakąś bibliotekę która ci to skonwertuje.

Spróbuj tego:

wchar_t unic = getline(/*argumenty*/);
char asc=(char)unic;
0

Chmmm, chyba będę musiał ręcznie wyłuskiwać puste znaki albo szukać innych bibliotek do obsługi plików...
bo
getline() przyjmuje tylko stringi
a obiekt_ifstream->get() tylko char *
...
i zawsze zostają puste pola... wchar_t nie moge podpiąć...

w takich momentach mysle o javie ; p
[glowa]

-edit-
znalazłem jeszcze konwersje wchar
http://msdn.microsoft.com/en-us/library/ms235631(VS.80).aspx
ale w moim przypadku tylko trzy krzaki się pojawiają ; |

0

spróbuj wofstream i wifstream.
Ale ostrzegam, że czytanie pisanie wielobajtowe w STL nie jest proste, a wszystko przez różne kodowania.
Popatrz np tu: http://www.codeproject.com/KB/stl/upgradingstlappstounicode.aspx
http://www.gamedev.net/community/forums/topic.asp?topic_id=362755

0

Obczaiłem artykuł i było tam to czego szukałem

wstring IrrSceneToBullet::toWideString( const char* pStr , int len )
{
//ASSERT_PTR( pStr ) ; bez tego
//ASSERT( len >= 0 || len == -1 , _T("Invalid string length: ") << len ) ;
// figure out how many wide characters we are going to get
int nChars = MultiByteToWideChar( CP_ACP , 0 , pStr , len , NULL , 0 ) ;
if ( len == -1 )
-- nChars ;
if ( nChars == 0 )
return L"" ;
// convert the narrow string to a wide string
// nb: slightly naughty to write directly into the string like this
wstring buf ;
buf.resize( nChars ) ;
MultiByteToWideChar( CP_ACP , 0 , pStr , len ,
const_cast<wchar_t*>(buf.c_str()) , nChars ) ;
return buf ;
}

Głównie chodziło o MultiByteToWideChar, ale ta funkcja daje ten sam efekt ; )
przy każdej konwersji ciąg się urywa przy pierwszym pustym znaku... albo funkcje działają nie tak albo w czasie ładowania pliku jakaś informacja się zatraca mi się zdaje....

a jakaś inna open-s lekk biblioteczke do obslugi plikow unicode znacie ? ; p

0

Mi się wydaje że nie w tę stronę co trzeba konwertujesz plik (raczej użyj WideCharToMultiByte
i potem już normalnie,) .
Jeśli jest w Unicode ,to przerób go na char 'C' , bo z przykładu który
podałeś (z MultiByteToWideChar) wynika że funkcja konwertuje char na Unicode czyli konwertujesz
znaki szerokie na szerokie jeśli wczytany plik jest Unicode co jest całkiem bez sensu ,,,,
Określ w którym kierunku chcesz działać , czy całkowicie ddziałać na
Unicode czy konwertować (jeśli istnieje potrzeba ).
Jeśli wynik ma być uzyskiwany jednorazowo w postaci pliku ze znakami ASCII
bez wprowadzania zmian w oryginalnym pliku to prawidłowe przeprowadzenie
konwersji powinno wystarczyć a na uzyskanym pliku można będzie już użyć std bez widechar.
Konkretnie co chcesz wyciągnąc ?
Podaj link do pliku .... xml

Opcja inna:

a jakaś inna open-s lekk biblioteczke do obslugi plikow unicode znacie ?

I tu też w innym kierunku bym poszedł i szukał raczej biblioteki do obsługi xml .

0
dzejo napisał(a)

Podaj link do pliku .... xml

nie wklejaj go nigdzie. zaden pastebin. zzipuj i gdzies opublikuj. zeby pomoc, musimy zobaczyc żywy, oryginalny, 'binarny' plik. to o czym pisze MarekR22 powinno Ci wystarczyc - strumienie domyslnie operuja na char, ale mozna je 'zmusic' do pracy na wide char. jednak w zaleznosci od sposobu kodowania pliku (inne cp, utf7/8, utf16, utf32, ..) czasem trzeba dopisac pare drobnych metod wspomagajacych (np. dodawanie/usuwanie preambuly unicode, wykrywanie big/little endian w utf16/32 itd)..

..zawsze tez mozesz przywalic łopata - jakims edytorem tekstowym przekonwertuj plik xml z unicode na ascii w Twojej docelowej stronie kodowej i .. uzyj zwyklych (narrow) strumieni

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