Wartość liczbowa znaku w zmiennej UnicodeString

dział ogólny

Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 15:52

Mam w zmiennej typu UnicodeString literę:

UnicodeString liter = "À";

W tablicy ASCII ta litera ma wartość 192.

jak pobrać tą wartość do zmiennej typu int?

Już kiedyś coś podobnego robiłem, ale z AnsiString.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez polymorphism » piątek, 21 maja 2010, 15:58

Kod: Zaznacz cały
int x = (int)liter(0); 

:?:
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 16:02

Niestety nie przejdzie, otrzymuję komunikat błędu:


Range check error.

Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 16:05

Już wiem dlaczego był błąd. Początek tablicy to 1 nie 0.

Kod: Zaznacz cały
    int x = (int)liter(1);


tak działa, ale zwraca mi numer 65 jak dla dużej litery A, a nie À (A apostrof).
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez polymorphism » piątek, 21 maja 2010, 16:17

Hmm, jest taka możliwość, że znak ten jest znakiem składanym, tzn składa się z dwóch znaków - A i '. Unikod daje taką możliwość, i nie zdziwiłbym się, gdyby to był taki przypadek. Choć jakiegoś innego, dziwnego mapowania unicode -> ansi wykluczyć nie można...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 16:22

W środowisku Embarcadero RAD Studio 2010 te znaki są określane mianem High ASCII Chart. W pomocy znalazłem tabelę znaków podzieloną na dwie części 0-127 i 129-255. Na razie szukam dalej, gdyż musi istnieć sposób na wydobycie tego.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 17:00

Ten Twój sposób jednak działa, tylko trzeba najpierw dokonać konwersji

Kod: Zaznacz cały
  String tekst = L"à"; // <- tutaj zabrakło L, aczkolwiek nie rozumiem dlaczego

  int x = (int)tekst[1];


Nie rozumiem dlaczego ta konwersja musi być wykonywana dla znaków z zakresu 128-255, gdyż powyżej 255 nie trzeba już dodawać tego L.
To ma chyba jakiś związek z edytorem kodu, gdyż wczytanie tych liter z pliku do zmiennej UnicodeString nie wymaga już konwersji.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez polymorphism » piątek, 21 maja 2010, 17:29

A widzisz, nie zauważyłem braku tego L. Jeśli chodzi o konwersję, to musi być wykonana, ponieważ znaki ASCII z kodami powyżej 127 mają inne wartości w unikodzie.

(...) gdyż powyżej 255 nie trzeba już dodawać tego L.

Hmm, powyżej 255 w typie char nie zmieścisz...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 18:02

Hmm, powyżej 255 w typie char nie zmieścisz...


UnicodeString współpracuje z wchar_t. Tylko że tablica ASCII chyba nie ma rozmiaru powyżej 255. Podałem, że powyżej 255 nie trzeba dokonywać konwersji gdyż podanym sposobem sprawdzałem wartość litery ą i wskazało mi chyba 261, z konwersją i bez konwersji było tak samo.

Co do tego L to spawa nie jest taka oczywista. Jest ono wymagane tylko w przypadku gdy zmienna ta zmienna UnicodeString jest konwertowana na wchar_t, czyli np.:

Kod: Zaznacz cały
Application->MessageBox( L"Komunikat", L"Tytuł", MB_OK);

  // lub:
  Application->MessageBox(L"Długi"           // tutaj L
                                        L"Komunikat", // i tutaj L
                                        L"Tytuł", MB_OK);


W sytuacji gdy treść komunikatu jest wpisywana bezpośrednio do zmiennej UnicodeString i nawet jest łamana, to nie ma potrzeby konwertować tekstu za pomocą L:

Kod: Zaznacz cały
String message = "ĄĘŚĆŻŹ "
"  ąęśćżźó";

Application->MessageBox(message.w_str(), L"Tytuł", MB_OK);


Oczywiście zachodzi tutaj konwersja w_str(), ale nie na łańcuchu znaków lecz na zmiennej.

Jeżeli jednak wprowadzę do łańcucha znaków literę z zakresu 128-255 to muszę użyć L. Wychodzi mi więc, że polskie znaki diakrytyczne zawierają się w przedziale 0-127.

Wpisując w edytorze kodu znaki z zakresu 128-255 trzeba użyć konwersji L, ale wczytując do zmiennej te same znaki z pliku, już nie trzeba przeprowadzać konwersji, ale żeby uniknąć kwadracików na końcu tekstu należałoby posłużyć się zmienną wchar_t a nie UnicodeString.

Trochę to wszystko pogmatwane.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 18:26

Potrzebne mi to jest do konwersji kodowania ISO-8859-1 do UnicodeString, ale niestety to nic mi nie dało, gdyż np. znak: À ma numer À, ale na stronach html kodowany jest jako &Agrave;

Stworzyłem taką funkcję:

Kod: Zaznacz cały

String __fastcall Decode_ISO_88591
(String webText)
{
 webText = StringReplace(webText, "+", " ", TReplaceFlags() << rfReplaceAll);

 String tabLitery =
           L"ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ";

 String tabSymbole[] = {
 "Agrave", "Aacute", "Acirc", "Atilde", "Auml", "Aring", "AElig", "Ccedil",
 "Egrave", "Eacute", "Ecirc", "Euml", "Igrave", "Iacute", "Icirc", "Iuml",
 "ETH", "Ntilde", "Ograve", "Oacute", "Ocirc", "Otilde", "Ouml", "Oslash",
 "Ugrave", "Uacute", "Ucirc", "Uuml", "Yacute", "THORN", "szlig", "agrave",
 "aacute", "acirc", "atilde", "auml", "aring", "aelig", "ccedil", "egrave",
 "eacute", "ecirc", "euml", "igrave", "iacute", "icirc", "iuml", "eth",
 "ntilde", "ograve", "oacute", "ocirc", "otilde", "ouml", "oslash", "ugrave",
 "uacute", "ucirc", "uuml", "yacute", "thorn", "yuml"
 };

 for(unsigned int i = 0; i < ARRAYSIZE(tabSymbole); i++)
 {

  webText = StringReplace(webText, "&" + tabSymbole[i] + ";", tabLitery[+ 1],
                                            TReplaceFlags() << rfReplaceAll);
 }


 return webText;
}
 


Działa jak należy, ale może ktoś ma lepsze propozycje?!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez polymorphism » piątek, 21 maja 2010, 19:11

Podałem, że powyżej 255 nie trzeba dokonywać konwersji gdyż podanym sposobem sprawdzałem wartość litery ą i wskazało mi chyba 261, z konwersją i bez konwersji było tak samo.

Wydawało mi się, że mowa o literale tekstowym bez L, a to jest tekst w formacie multibyte, czyli mówimy o typie char[]. Zatem o znakach z kodami powyżej 255 mowy być nie może, nawet jeśli to będzie tekst w utf-8.

Co do tego L to spawa nie jest taka oczywista.

Zasadniczo jest. L dodajesz jeśli chcesz, żeby literał tekstowy był w szerokich znakach (wide-char), pod windowsem oznacza to kodowanie utf-16.

Jeżeli jednak wprowadzę do łańcucha znaków literę z zakresu 128-255 to muszę użyć L

Nie musisz. Ale nie możesz używać znaków, które nie należą do danej strony kodowej.

Wychodzi mi więc, że polskie znaki diakrytyczne zawierają się w przedziale 0-127.

Nie. Wszelkie znaki diakrytyczne, nie tylko polskie, zawierają się w przedziale powyżej 127 (tzw. extended ASCII)

Działa jak należy, ale może ktoś ma lepsze propozycje?!

Użyłbym std::mapy.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 19:26

Nie ze wszystkim się zgodzę.

Nie. Wszelkie znaki diakrytyczne, nie tylko polskie, zawierają się w przedziale powyżej 127 (tzw. extended ASCII)


Mam tutaj tablicę ASCII i nie mam polskich znaków diakrytycznych w żadnych przedziale, czyli nie ma ich w przedziale 0-255, więc może są kodowane jako suma dwóch różnych znaków.

ascii.png


Cyfrowy Baron napisał(a):Jeżeli jednak wprowadzę do łańcucha znaków literę z zakresu 128-255 to muszę użyć L

Nie musisz. Ale nie możesz używać znaków, które nie należą do danej strony kodowej.


Jeżeli do zmiennej UnicodeString znak z zakresu 128-255 i nie poprzedzę go literałem L, to nie wyświetli mi tego znaku, lecz inny zastępczy.



Użyłbym std::mapy.


Pokaż jak! Mi nie che się już nic nowego wymyślać, szczególnie, że natknąłem się na nowy problem.
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez polymorphism » piątek, 21 maja 2010, 20:02

Mam tutaj tablicę ASCII i nie mam polskich znaków diakrytycznych w żadnych przedziale, czyli nie ma ich w przedziale 0-255

Chwila, ale to są kody unikodu! Mówimy o kodowaniu ANSI (vide CP852, CP1250 i ISO 8859-2).

Obrazek

Jeżeli do zmiennej UnicodeString znak z zakresu 128-255 i nie poprzedzę go literałem L, to nie wyświetli mi tego znaku, lecz inny zastępczy.

Być może jest problem ze stroną kodową. Normalnie ja robisz konwersję ansi -> unikod, musisz podać stronę kodową. Tu podejrzewam, że jest użyta taka, w jakiej pracuje środowisko, ewentualnie systemowe. Musiałbyś podejrzeć w debugerze jakie kody mają znaki diakrytyczne z literału, wtedy byłoby wiadomo, gdzie jest problem.

Pokaż jak!

Nie no, bez przesady, nie będę za Ciebie pisał kodów ;)
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez Cyfrowy Baron » piątek, 21 maja 2010, 20:29

Chwila, ale to są kody unikodu! Mówimy o kodowaniu ANSI (vide CP852, CP1250 i ISO 8859-2).


Ja od początku pisze o UnicodeString więc o unicode, co do strony kodowej to chodzi mi o ISO 8859-1 a nie ISO 8859-2.



Nie no, bez przesady, nie będę za Ciebie pisał kodów ;)


Napisałeś std::mapy więc sądziłem, że masz coś czego ja nie znam, a Tobie chodzi po prostu o tablicę asocjacyjną. Nie wydaje mi się, by tablica asocjacyjna była lepszym rozwiązaniem. Trzeba by ją najpierw wypełnić, a to więcej pisania, ale dostęp do danych nie byłby szybszy, byłby wręcz problematyczny, gdyż np. mając taki wyraz:

Alic&egrave; musiałbym wydobyć z tego ciągu znaków &egrave; by móc podstawić dane z tablicy:

Kod: Zaznacz cały
std::map<String, String> iso;

iso["&egrave;"] = "è";


Trzeba by opracować funkcję, która z wyrazu Alic&egrave; wydobędzie ciąg &egrave; który jest kluczem, a potem trzeba by podmienić wartość z tablicy podstawić wartość. Dało by się to zrobić, ale byłoby to bardziej skomplikowane, a więc mniej praktyczne.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Wartość liczbowa znaku w zmiennej UnicodeString

Nowy postprzez polymorphism » piątek, 21 maja 2010, 21:36

Ja od początku pisze o UnicodeString więc o unicode, co do strony kodowej to chodzi mi o ISO 8859-1 a nie ISO 8859-2.

No ale była mowa o L, a to się odnosi tylko do literałów tekstowych. W swoim kodzie masz coś takiego:
UnicodeString liter = "À";

więc temat kodowania ansi jest.

Dało by się to zrobić, ale byłoby to bardziej skomplikowane, a więc mniej praktyczne.

O, tu się mylisz. Mniej praktyczne jest pisanie niewydajnych rozwiązań (62 razy analizujesz tekst!). Choć przyznam Ci rację, na mapie może to być nie tyle kłopotliwe, co niekonieczne. Można to zrobić na tablicach, tylko trzeba by je posortować, co by można było użyć wyszukiwania binarnego - coś jak mapa, ale na sztywno. Tekst analizowałbyś tylko raz.

No ale nieważne...
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Następna strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 56 gości

cron