Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Allegro] i biblioteka string

Ostatnio zmodyfikowano 2012-08-14 23:19
Autor Wiadomość
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.
P-62439
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.
Frazy, które należy wpisać w wyszukiwarkę google:
P-62440
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:
 
  set_uformat(U_UTF8);
   przed   
allegro_init();
        
a mimo to
C/C++
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ć.
P-62480
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 )
C/C++
#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 :)
P-62517
« 1 »
  Strona 1 z 1