Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

konwersja stringa, unicode string, ansi, ascii itd

Ostatnio zmodyfikowano 2019-09-01 12:59
Autor Wiadomość
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
P-175147
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:
C/C++
#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.
P-175148
pekfos
» 2019-08-31 11:40:43
Przede wszystkim warto wiedzieć, że tak naprawdę możesz trzymać dowolne napisy w dowolnym kodowaniu
Nie.
w dowolnych zmiennych.
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.
P-175149
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:
C/C++
string tmpstring = "Text";
ShowMessage( tmpstring );
daje błąd
Cannot convert 'string' to 'UnicodeString'

ale już kod:

C/C++
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ć.
P-175150
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.
P-175151
« 1 »
  Strona 1 z 1