przechowywanie nazwy pliku/katalogu, FAT32

0

Cześć,

mam taki problem. W FAT32 każdy znak nazwy pliku/katalogu jest trzymany na dwóch bajtach. Jak go przechowywać w programie? Dotychczas przechowywałem to w zwykłym

std::string 

, ale wiem, że to nie jest eleganckie. std::wchar

 też nie jest fajne ponieważ nie ma określonej wielkości znaku w bajtach, zależy ona od platformy, a mi zależy na wiadomej z góry wielkości.

Więc jak to przechowywać? Myślałem o 
```cpp
std::vector<char16_t> 

tylko trochę dziwnie trzymać napis w wektorze.

Z góry dzięki za rady

0

Dobra znalazłem to http://www.cplusplus.com/reference/string/u16string/
Nie usunę tematu bo może ktoś poda mi lepszy pomysł

0

jest to kodowanie UTF-16.

jeśli piszesz pod Windowsa, to używasz po prostu wchar_t (który pod Windowsem ma dwa bajty) i wstring. nie będą potrzebne u16char_t ani u16string, bo to to samo co wchar_t i wstring.

pod Linuksem króluje UTF-8, a do UTF-16 są właśnie u16char_t i u16string. wymagają C++11, ale to chyba nie problem.
jeżeli zwykły char i string jest w UTF-8 (a tak dziś pod Linuksem można założyć) to konwersja char--wchar_t--u16char_t jest bezstratna w obie strony.

Myślałem o
std::vector<char16_t>

od tego jest std::basic_string. zwykły string to basic_string<char>, wstring to basic_string<wchar_t> itp.

0

Dzięki za odpowiedź.

Piszę pod linuxa, ale chciałem też zachować przenośność, żeby się nauczyć takiego programowania.

Mam kolejne pytanie.

Jeżeli będę przechowywał nazwę pliku/katalogu (te z fata) w

u16string

i do interakcji z użytkownikiem będę używał Qt. To czy mam rzutować wszystkie ścieżki od użytkownika (te z Qt) do utf-8 za pomocą QByteArray QString::toUtf8() const

 i potem nazwę pliku też do utf-8? Czy rzutować ścieżki od użytkownika do utf-16 <code class="cpp">const ushort * QString::utf16() const 

i tworzyć z tego nowy obiekt u16string

?

Mógłbym też nazwę pliku/katalogu od razu rzutować na QString, ale nie wiem czy to będzie fajne bo chciałem oddzielić część "nisko poziomową" od GUI w Qt.


 > ##### [Azarien napisał(a)](http://4programmers.net/Forum/1127542):
> > Myślałem o
> > std::vector<char16_t>
> 
> 
> od tego jest `std::basic_string`. zwykły string to `basic_string<char>`, wstring to `basic_string<wchar_t>` itp.

Tak wiem potem znalazłem ;)


EDIT

Wymyśliłem coś takiego, jeżeli ktoś ma uwagi/radę to chętnie wysłucham.

Ścieżki z Qt będę konwertował do 
```cpp
std::string 

, który jak poczytałem, będzie miał w sobie napis w utf-8.
Po wydobyciu z FAT'a nazwy pliku od razu z

std::u16string

przekonwertuje go do std::string

, który również będzie miał w sobie uft-8.
Takie podejście w sumie wszystko załatwia

Jak ktoś ma lepszy pomysł to śmiało :)
0

Ścieżki z Qt będę konwertował do std::string, który jak poczytałem, będzie miał w sobie napis w utf-8.

Pod Linuksem, ale nie pod Windowsem, a przecież chciałeś mieć przenośność.

Właściwie to zwykłego stringa (std::string) powinieneś w ogóle nie używać, a tylko u16string i stringa z Qt.

0

std::string QString::toStdString() const

Returns a std::string object with the data contained in this QString. The Unicode data is converted into 8-bit characters using the toUtf8() function.

Czy to nie znaczy, że gdy zrobię

 
QString qstr;
std::string stdStr = qstr.toStdString();

to w stdStr będę miał napis zakodowany w uft-8?

1

to w stdStr będę miał napis zakodowany w uft-8?

Właśnie sprawdziłem pod Qt 5.3 / Visual 2010. Rzeczywiście koduje do UTF-8. Kiedyś chyba tak nie było.
To ewidentny błąd, bo z takiego stringa niewielki pożytek pod Windowsem.

W takim razie pisz kod pod Linuksa, bo pod windą to i tak nie działa. Qt jest skopane.

0

Wiadomo, że w przenośnym programie będą

#ifdef 

itp. gdzie trzeba by wstawić kod przeznaczony na daną platformę. Program będzie działał tylko na linuxie, ale chciałem w jak największym stopniu zachować przenośność.

Dzięki za pomoc :)

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