Jak odczytać polskie znaki z tekstowych plików *.dfm i *.fmx

0

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.

1

to są kody znaków w unicode https://en.wikipedia.org/wiki/List_of_Unicode_characters - 281 dec = ę

1

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.

0
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).

0

OK. racja - niefortunny skrót myślowy. Chodziło mi o zapis U+105 (hexadecymalnie) co jest równoważne #261 (dziesiętnie) .

0

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

0
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.

1

Pomijając już XY, w czym problem? Podmieniasz #(\d+) na char32_t(std::stoi(match[1])) (albo wchar_t) i tyle...

1

przez te 7h to byś napisał taką funkcję w 20 językach...

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