forritarik Temat założony przez niniejszego użytkownika |
konwersja stringa, unicode string, ansi, ascii itd » 2019-08-31 08:08:01 Witam,
zetknąłem się teraz z dość dużym projektem nie pisanym przeze mnie a na dodatek zaczynam zabawę z C++. Problem polega na tym że muszę nauczyć się konwertować dane pomiędzy różnymi typami np string , unicode string, ansi, ascii. Liznąłem już trochę wiedzy na temat kodowania znaków (fajny artykuł znalazłem m.in. tutaj -> http://kursdlaopornych.pl/iso-ascii-unicode-kodowanie-znakow/ to tak jakby ktoś był zainteresowany) ale jak doszło do praktyki, czyli konwersji w C++ zaczęły się schody.
Czy może mnie ktoś nakierować na jakieś materiały tego typu. I proszę nie piszcie tylko "google" bo już tam byłem i owszem są jakieś wiadomości ale szczątkowo i chaotycznie. Mi chodzi bardziej np o jakąś pozycję książkową lub jakiś artykuł w necie który załatwia problem kompleksowo, opisuje to od A do Z.
Nie ogarniam po prostu tych stringów, wstringów , char, wchar_t itd. Kiedy jest to a kiedy tamto i jak to przekonwertować. Narazie czarna magia.
Zapomniałem tylko dodać jeżeli to ważne że aktualnie użytkuję C++ Builder 10.2 Tokyo
pozdrawiam |
|
jankowalski25 |
» 2019-08-31 10:30:17 Przede wszystkim warto wiedzieć, że tak naprawdę możesz trzymać dowolne napisy w dowolnym kodowaniu w dowolnych zmiennych. Wszystko zależy tak naprawdę od tego, jakiego kodowania i jakiego typu oczekuje jakaś funkcja/metoda/klasa/whatever. Także cóż, przydałoby się więcej szczegółów odnośnie tego, w jaki sposób używasz konkretnych napisów. Na przykład coś takiego: #include <iostream> #include <string>
int main() { std::string napis = "Zażółć gęślą jaźń"; std::cout << napis; } U mnie coś takiego działa bezproblemowo, bo zarówno edytor, jak i sama konsola korzysta z UTF-8, więc mogę tak zrobić. Jeśli jednak korzystasz z czegoś innego (WinAPI, SFML, jakaś jeszcze inna biblioteka?), to tak naprawdę zależy od tego, czego konkretna biblioteka oczekuje. |
|
pekfos |
» 2019-08-31 11:40:43 Przede wszystkim warto wiedzieć, że tak naprawdę możesz trzymać dowolne napisy w dowolnym kodowaniu |
Nie. Nie. Nie ogarniam po prostu tych stringów, wstringów , char, wchar_t itd. Kiedy jest to a kiedy tamto i jak to przekonwertować. | std::string to ciąg znaków char, a std::wstring to ciąg znaków wchar_t. Jeśli piszesz w C++11, jak przystało na 2019 rok, to są też std::u8string, std::u16string i std::u32string, odpowiednio kodowane w UTF-8, -16 i -32. std::wstring jest kodowane w jakimś Unicode, typowo UTF-16 lub UTF-32, ale nie polegaj na tym że to jest konkretne z nich. char ma gwarantowany rozmiar jednego bajta, więc std::string jest kodowane w jakimś kodowaniu wielobajtowym, jak strony kodowe oraz UTF-8. Jak ma działać, używaj konkretnego kodowania w kontekście, które tego konkretnego kodowania oczekuje. Każde kodowanie inne niż Unicode będzie miało ograniczenia. Używając stron kodowych nie masz szans by mieć w jednym napisie znak polski i chiński, być może nawet w jednym programie. Najlepiej nigdy nie używaj niczego innego niż Unicode, ale tak się zwykle nie da. Napisz co dokładnie chcesz osiągnąć. Z samymi konwersjami sprawa jest bardziej skomplikowana. Nie ma standardowego rozwiązania by skonwertować napis z jednego kodowania na inne. To znaczy niby jest od C++11 std::wstring_convert, ale już zdeprecjonowane bez żadnego zamiennika, to samo z <codecvt>. Najlepiej użyj zewnętrznej biblioteki. Na Windowsie jest zawsze pod ręką WinAPI z funkcjami typu WideCharToMultiByte(). Jeśli chcesz czegoś przenośnego, to jest też boost, no i oczywiście Towarzysz Stallman też się zawsze podzieli. Możesz to też zaimplementować samemu, konwersje między samymi UTFami nie są skomplikowane. Ja osobiście używam własnych implementacji do wszystkich konwersji tekstowych, w tym tych między liczbami. |
|
forritarik Temat założony przez niniejszego użytkownika |
» 2019-08-31 22:41:39 Do testów utworzyłem sobie nowy projekt i zacząłem się bawić. Już na początku natrafiłem na błąd konwersji np. taki kod: string tmpstring = "Text"; ShowMessage( tmpstring );
daje błąd Cannot convert 'string' to 'UnicodeString' ale już kod: String tmpString = "Text"; ShowMessage( tmpString );
działa bez problemu. I już pojawia się pytanie czym różni się string od String. Dlatego pytałem o jakieś materiały żeby sobie o tym poczytać. |
|
pekfos |
» 2019-09-01 12:59:19 I już pojawia się pytanie czym różni się string od String. Dlatego pytałem o jakieś materiały żeby sobie o tym poczytać. | string należy do biblioteki standardowej, String należy do biblioteki VCL, której najpewniej byś nigdy nie użył, gdybyś nie używał C++ Buildera. |
|
« 1 » |