Ciąg polskich ęóąśżźć€ znaków wpisany do komponentu TEdit i zapisany do pliku tekstowego *.dfm albo *.fmx wygląda tak:
#281#243#261#347#380#378#263#8364
Chciałbym we własnym programia (C++ Builder 10.3) odczytać tak zapisany tekst. Czy może ktoś wie jaka procedura dokonuje konwersji powyższego tekstu na UnicodeString ?
Pomijam opcję wczytania całego pliku i wyłuskanie tekstu z komponentu TEdit.
to są kody znaków w unicode https://en.wikipedia.org/wiki/List_of_Unicode_characters - 281 dec = ę
To mi pachnie problemem XY. Pliki DMF opisują konstrukcję okna w C++ builder i nie widzę powodu, by twój kod musiał odczytywać ten plik.
Możesz wyjaśnić po co ci to? W sensie jaką funkcjonalność chcesz uzyskać z punktu widzenie użytkownika końcowego.
abrakadaber napisał(a):
to są kody znaków w unicode https://en.wikipedia.org/wiki/List_of_Unicode_characters - 281 dec = ę
To wiem - znam sposób kodowania UTF-8. Chodzi mi tylko o procedurę która ciąg znaków składający się z cyfr i znaku '#' (czyli znaków o kodach <127 ) "#281#243#261#347#380#378#263#8364" przekształci w UnicodeString "óąśżźć€". Sądzę że istnieje, bo bilder to robi gdyż jak wczytuje formę (z plikiem tekstowy *.dfm albo *.fmx) z TEdit to wyświetla polskie znaki. Nie mogę tylko jej znaleźć.
MarekR22 napisał(a):
To mi pachnie problemem XY. Pliki DMF opisują konstrukcję okna w C++ builder i nie widzę powodu, by twój kod musiał odczytywać ten plik.
Możesz wyjaśnić po co ci to? W sensie jaką funkcjonalność chcesz uzyskać z punktu widzenie użytkownika końcowego.
Piszę program który analizuje pliki tekstowe *.fmx w celu wyłuskania z nich pewnych nielicznych informacji tekstowych z polskimi znakami. Mógłym oczywiście mechanizmami Buildera wczytać i utworzyć całą formę a z jej komponentów odczytać interesujący mnie tekst jako UnicodeString ale to byłoby bardzo nadmiarowe (samą formą nie jestem w tym programie zainteresowany).
OK. racja - niefortunny skrót myślowy. Chodziło mi o zapis U+105 (hexadecymalnie) co jest równoważne #261 (dziesiętnie) .
nie bardzo rozumiem jakiej procedury się spodziewasz - jak już pisałem, np. 281
to kod znaku i jak każdy kod można go zamienić na znak procedurą Chr
, która jest w delphi odkąd pamiętam (a jest to już kawałek czasu) http://docwiki.embarcadero.com/Libraries/Rio/en/System.Chr
abrakadaber napisał(a):
nie bardzo rozumiem jakiej procedury się spodziewasz - jak już pisałem, np.
281
to kod znaku i jak każdy kod można go zamienić na znak procedurąChr
, która jest w delphi odkąd pamiętam (a jest to już kawałek czasu) http://docwiki.embarcadero.com/Libraries/Rio/en/System.Chr
np. takiej
w FireMonkey Label1->Text = P("#281#243#261#347#380#378#263#8364");
w VCL Label1->Caption = P("#281#243#261#347#380#378#263#8364");
i na ekranie wyświetli się ęóąśżźć€. Sądzę, że Embarcadero ma ją w Builder - bo dokładnie to robi (!) czytając plik tekstowy *.dfm/*.fmx przy otwieraniu w kompilatorze zapisanej wcześniej TForm dla dalszej edycji. Pewnie ma też procedurę odwrotną bo robi to przy zapisie TForm.
Pomijając już XY, w czym problem? Podmieniasz #(\d+)
na char32_t(std::stoi(match[1]))
(albo wchar_t
) i tyle...
przez te 7h to byś napisał taką funkcję w 20 językach...