marianekA Temat założony przez niniejszego użytkownika |
[Allegro] i biblioteka string » 2012-08-14 09:04:59 Piszę program tekstowy no i oczywiście używam polskich znaków. Zauważyłem że w bibliotece string funkcje size(), length() działają prawidłowo tylko wówczas gdy kody znaków ASCII w zmiennej string nie są wyższe od 127. Znaki z wyższym kodem liczone są podwójnie. przykład: string a1 ="abcdef" - tu policzy dobrze jako 5, string a2 ="ąbćdęf" - tu policzy więcej bo jako 8,
czy da się to jakoś obejść? Innych funkcji jeszcze nie sprawdziłem. |
|
jankowalski25 |
» 2012-08-14 10:33:48 string a1 = "abcdef" - tu policzy dobrze jako 5 A nie jako 6? Sprawdź, jakie masz kodowanie znaków. Na forum było sporo tematów o polskich znakach w allegro. |
|
marianekA Temat założony przez niniejszego użytkownika |
» 2012-08-14 17:11:00 faktycznie źle policzyłem, powinno być: string a1 ="abcdef" - tu policzy dobrze jako 6, string a2 ="ąbćdęf" - tu policzy więcej bo jako 9, Kodowanie mam ustawione na UTF-8, nawet mam: przed a mimo to for( size_t i = 0; i < a2.size(); ++i ) textprintf_ex( bufor, font, 10, 10 + i * 10, 0, - 1, "%d ",( unsigned char ) a2[ i ] );
przy napotkaniu znaku o kodzie ASCII większym jak 127 wyświetla dwie wartości jak w tym przykładzie: jest zamiast ą - 196,133, 261, b - 98, 98, ć - 196,135, 263, d - 100, 100, ę - 169,153, 281, f - 102, 102, Pewnie tego się nie zmieni ale już wiem jak sobie z tym poradzić. |
|
SocrateZ |
» 2012-08-14 23:19:52 Nie pomyślałeś o tym że unsigned char posiada zakres do 255 ? W allegro 5 masz funkcję al_ustr_create czy coś w tym stylu :) Miałem nawet fajne rozwiązanie ( prawie :P ) Mam :D Przykład z Allegro5 ( Prawie jak pole tekstowe :P ) #include <allegro5/allegro.h> #include <allegro5/allegro_primitives.h> #include <allegro5/allegro_font.h> #include <allegro5/allegro_ttf.h> #include <iostream>
int main( void ) { al_init(); al_init_font_addon(); al_init_ttf_addon(); al_install_keyboard(); ALLEGRO_DISPLAY * display = al_create_display( 800, 600 ); ALLEGRO_EVENT_QUEUE * queue = al_create_event_queue(); ALLEGRO_TIMER * timer = al_create_timer( 1.0 / 60 ); ALLEGRO_FONT * font = al_load_font( "DejaVuSans.ttf", 16, 0 ); ALLEGRO_USTR * string = al_ustr_new( "" ); bool run = true; bool redraw = true; al_register_event_source( queue, al_get_keyboard_event_source() ); al_register_event_source( queue, al_get_timer_event_source( timer ) ); al_start_timer( timer ); while( run ) { ALLEGRO_EVENT event; al_wait_for_event( queue, & event ); if( event.type == ALLEGRO_EVENT_TIMER ) { redraw = true; } else if( event.type == ALLEGRO_EVENT_KEY_UP ) { if( event.keyboard.keycode == ALLEGRO_KEY_ESCAPE ) run = false; } else if( event.type == ALLEGRO_EVENT_KEY_CHAR ) { if( event.keyboard.unichar != 0 ) al_ustr_append_chr( string, event.keyboard.unichar ); } if( redraw && al_is_event_queue_empty( queue ) ) { al_draw_ustr( font, al_map_rgb( 255, 255, 255 ), 50, 50, 0, string ); al_flip_display(); al_clear_to_color( al_map_rgb( 0, 0, 0 ) ); } } }
Wracając do pytania: Dlaczego są liczone podwójnie? Znak łąćś i inne polskie ogonki mają po 2 bajty, podczas gdy ASCII mają po 1 A sprawdź znak € ( [r]alt+u ) - ma 3 bajty, będzie liczony potrójnie :) |
|
« 1 » |