bład w programie ... kody Unicode

0

Witam.. mam problem i liczę na Wasza pomoc. Muszę stworzyć program który będzie odczytywał wartości binarne z "ciagbinarny" (TMemo) oraz litery z kontenera.Jeśli napotka w ciagubinarnym "1" to zamienia odpowiednia literę w kontenerze na tą samą ale o innym kodzie. Przykładowo
... litera "a" ma kod Unicode 97 oraz 65377
... litera "b" ma kod 98 i 65378 itd.
Zatem jeśli w ciągbinarny bedzie "1" to np kod 97 zamienia na 65377
Tablica "litery" jest typu Word bo np char obsługuje tylko wartości od 0 do 255... tylko teraz mam problem, gdyż te zmodyfikowane litery chciałam wpisać do nowego okienka Memo1 a wyświetlają mi się tylko liczby a nie odpowiadające im znaki. Rzutowania na char nie moze być.

Word litery[200];
for(int i=1;i<=kontener->GetTextLen();i++)
       litery[i]=kontener->Lines->Text[i] ;
char ciag[200];
for(int j=1;j<=ciagbinarny->GetTextLen();j++)
       ciag[j]=ciagbinarny->Lines->Text[j] ;

for(int k=1;k<=ciagbinarny->GetTextLen();k++)
{
          if(ciag[k]=='1')
                 {
                  litery[k]+=65280; //bo taka jest różnica pomiędzy 97 a 65377 itd
                 }

}
for( int t=1;t<=kontener->GetTextLen();t++)
          Memo1->Lines->Text=Memo1->Lines->Text+litery[t];
0

może rzutowane na unsigned char?

0

niestety nie [glowa]

0

nie Word tylko wchar_t

0

... litera "a" ma kod Unicode 97 oraz 65377
... litera "b" ma kod 98 i 65378 itd.

A skąd ty te liczby wzięłaś? W utf-16 kody powyżej 55296 są znakami czterobajtowymi (2x wchar_t).

0
0x666 napisał(a)

... litera "a" ma kod Unicode 97 oraz 65377
... litera "b" ma kod 98 i 65378 itd.

A skąd ty te liczby wzięłaś? W utf-16 kody powyżej 55296 są znakami czterobajtowymi (2x wchar_t).

Powyżej 65535 tak naprawdę (ale wcześniej są luki). W każdym razie 65377 to nie żadne a tylko HALFWIDTH IDEOGRAPHIC FULL STOP
Litery łacińskie faktycznie są w tej okolicy, wygladaja wtedy tak, ale a ma wartość 65345. Tabelka tutaj:
http://www.alanwood.net/unicode/halfwidth_and_fullwidth_forms.html

0

Wzięłam je ze stron:
http://pl.wikisource.org/wiki/Unicode/0
http://pl.wikisource.org/wiki/Unicode/FF
To nadal nie działa :-( wyświetla mi np ciąg:
97 65280 65280 111 116 104 115 65280 97 65280 65280 106 115 65280 100 103 110 65280 65280 103 110 104 103 65280 101 65280 65280 103 65280 65280 101 65280 110 65280 65280 97 97 101 107 65280 98 97 101 107 103 103 97 101 110 116 107 104 103 107 97 110 98 101 107 114 103 97 101 114 103 110 107 101 114 114 107 101 114 103 107 101 114 103 110
zamiast zdania</image>

0
Azarien napisał(a)
0x666 napisał(a)

... litera "a" ma kod Unicode 97 oraz 65377
... litera "b" ma kod 98 i 65378 itd.

A skąd ty te liczby wzięłaś? W utf-16 kody powyżej 55296 są znakami czterobajtowymi (2x wchar_t).

Powyżej 65535 tak naprawdę (ale wcześniej są luki). W każdym razie 65377 to nie żadne a tylko HALFWIDTH IDEOGRAPHIC FULL STOP
Litery łacińskie faktycznie są w tej okolicy, wygladaja wtedy tak, ale a ma wartość 65345. Tabelka tutaj:
http://www.alanwood.net/unicode/halfwidth_and_fullwidth_forms.html

To czemu po wpisaniu 65345 wyświetla mi się litera "A" zamiast "a"?.. myślałam, że na stronie jest błąd

0

Twój problem polega na przekombinowanym kodzie. Po co ci ta tablica? Operuj na tym co dostarcza ci VCL czyli TAnsiiString albo TStrings czy jak to się tam nazywa. Poza tym masz typ znakowy użyty w TAnsiiString! Na pewno wspiera wiele dodatkowych możliwości, które ułatwią ci zadanie. Dawno nie używałem VCL, więc odsyłam do dokumentacji.

0

oj wyświetla:

97 65388 65380 111 116 104 115 65382 97 65395 65380 106 115 65395 100 103 110 65387 65380 103 110 104 103 65387 101 65387 65377 103 65391 65377 101 65377 110 65378 65387 97 97 101 107 65383 98 97 101 107 103 103 97 101 110 116 107 104 103 107 97 110 98 101 107 114 103 97 101 114 103 110 107 101 114 114 107 101 114 103 107 101 114 103 110

a nie jak dałam powyżej, ale i tak to nie to co chcę osiągnąć

0
dodda19 napisał(a)

Wzięłam je ze stron:
http://pl.wikisource.org/wiki/Unicode/0
http://pl.wikisource.org/wiki/Unicode/FF
Wartości na tej stronie są takie same jak na tej co ja podałem. A inne niż w twoim programie.

To nadal nie działa :-( wyświetla mi np ciąg:
Unikodowe znaki trzeba przechowywać w zmiennych typu UnicodeString, WideString, WideChar, wchar_t.
Nie char, nie AnsiChar i nie AnsiString.
Drugi problem, który dopiero wyskoczy, to że potrzebujesz kontrolek (TMemo, TLabel, itd.) z obsługą unikodu. Inaczej nie wyświetlisz tekstu nawet gdy poprawisz kod. Czyli albo potrzebujesz w miarę nowej wersji środowiska (2009, 2010) albo kontrolek TNT Unicode Controls działających w starszych wersjach. Są przewidziane dla Delphi, ale w C++ Builderze też powinny działać.

To czemu po wpisaniu 65345 wyświetla mi się litera "A" zamiast "a"?.. myślałam, że na stronie jest błąd
Na stronie nie ma błędu, błędne jest na pewno wyświetlanie. Jak to zrobiłaś?

0

Na stronie nie ma błędu, błędne jest na pewno wyświetlanie. Jak to zrobiłaś?

np:
Memo1->Lines->Text= (char)65345; //wyswietla "A"
Nawet w notatniku po wciśnięciu Ctrl i z klawiatury numerycznej wpisujac 65346 myświetla mi "A"

0

Drugi problem, który dopiero wyskoczy, to że potrzebujesz kontrolek (TMemo, TLabel, itd.) z obsługą unikodu. Inaczej nie wyświetlisz tekstu nawet gdy poprawisz kod. Czyli albo potrzebujesz w miarę nowej wersji środowiska (2009, 2010) albo kontrolek TNT Unicode Controls działających w starszych wersjach. Są przewidziane dla Delphi, ale w C++ Builderze też powinny działać.

Zastosowałam zmienna typu wchar_t ale oczywiście nie działa. Te kontrolki to muszę zainstalować? pierwszy raz się z tym spotykam:-(

0
Azarien napisał(a)

Powyżej 65535 tak naprawdę (ale wcześniej są luki).

Dokładnie, pomyliłem to z metodą zastosowaną w kodowaniu utf-8. A ów luka to przedział D800-DFFF, więc kody takie jak 65377 są poprawne.

0

czyli dla litery "a" poprawne jest 65377 czy 65345??

0

Czy tak ciężko zajrzeć do jakiejś tabeli? Zresztą Azarien podał Ci właściwy kod litery -> 65345.

0
0x666 napisał(a)

Czy tak ciężko zajrzeć do jakiejś tabeli? Zresztą Azarien podał Ci właściwy kod litery -> 65345.

Nie jest ciężko i chyba znam ją już na pamięć ale tabela tabelą . Mi wyświetla inaczej...dla 65345 mam "A"

0

Inaczej, bo są dwie sprawy:

  1. Środowisko. Jeśli używasz starej wersji, zapomnij o poprawnym wyświetlaniu znaków o tych kodach, chyba że zainstalujesz unikodowe wersje kontrolek - pisał o tym Azarien.
  2. Czcionka. Musisz ustawić także czcionkę, która poprawnie wyświetli znaki z tego przedziału. U mnie jest to Arial Unicode MS.
0

Aha :-) dziękuję bardzo

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