purebasic.info

PureBasic forum
Текущее время: Сб янв 20, 2018 11:56 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Функция Chr()
СообщениеДобавлено: Ср апр 27, 2016 4:46 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Так от делать нечего по изучал UTF-8 :roll:
И вот такую функцию написал,выводит символ UTF-8 по номеру от 0 до 2097151(4 байтный UTF-8)
и смотря на биты с номера 55296 по 57343 обнаружил что функция pokes()выводит один и тот же символ,не знаю что это? может ошибка API функции?
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
 
;(©) Автор под псевдонимом Сергейчик.
ProcedureCDLL$ CHR_UTF8(Nomer.i)
  Protected stroka.s=#Null$
  stroka=LSet(stroka,2,"")
  ;
  !push eax
  !push ebx
  !push edi
  ;
  !mov dword eax,[p.v_Nomer+12]
  !mov dword edi,[p.v_stroka+12]
  ;
  !CMP dword eax,0h
  !je dddw
  !cmp dword eax,127
  !Ja gyhw
  !
  ;//////////////////////////
  ;до (127),1 байтный utf-8
  !mov byte[edi],al
  !jmp dddw
  ;/////////////////////////
  !gyhw:
 !cmp dword eax,2047;от 800h до 10000h 3-х байтный utf-8
  !Ja sddw
  ;
  ;//////////////////////////////////
  ;от 127 до 800h 2-х байтный utf-8
  !mov byte bl,al
  ;===типа обнулить 6-7 бит
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  ;===========================
  !shr ax,6
  !or byte al,192;C0h
  ;==========;
  !mov byte ah,bl
  !mov word[edi],ax
  !jmp dddw
  ;////////////////////////////////
  !sddw:
 !cmp dword eax,65535;>10000h это уже 4-х байтный utf-8
  !Ja sddfw
  !
  ;//////////////////////////////////////////////////////
  ;3-х байтный utf-8 символ с числом юникода от 800h до 10000h
  !mov byte bl,al
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  ;
  !mov byte[edi+2],bl
  ;
  !mov word bx,ax
  !shr bx,6
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  ;
  !shr ax,12
  !or byte al,224
  ;
  !mov byte ah,bl;2-й байт
  !mov word[edi],ax
  !jmp dddw
  ;
  !sddfw:
 ;//////////////////////////////////////////
  ;4-х байтный utf-8 символ с числом юникода от 10000h до 200000h(2097152)
  !mov byte bl,al
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  ;
  !mov byte[edi+3],bl
  !mov word bx,ax
  !shr bx,6
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  !mov byte[edi+2],bl
  ;
  !mov dword ebx,eax
  !shr ebx,12
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  ;
  !shr eax,18
  !or byte al,240;f0h
  !mov byte ah,bl;2-й байт
  !mov word[edi],ax
  ;////////////////////////////////
  !dddw:
 !pop edi
  !pop ebx
  !pop eax
  ;
  ProcedureReturn stroka
EndProcedure
 



Последний раз редактировалось Сергейчик Чт окт 19, 2017 1:34 am, всего редактировалось 3 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Функция Chr()
СообщениеДобавлено: Ср апр 27, 2016 11:10 am 
Не в сети
профессор

Зарегистрирован: Пн янв 03, 2011 4:27 pm
Сообщений: 400
Благодарил (а): 5 раз.
Поблагодарили: 17 раз.
Пункты репутации: 0
Сергейчик, Почему стандартный CHR не устраивает?
И где pokes в твоей функций?
Может поможет https://ru.wikipedia.org/wiki/UTF-8, http://foxtools.ru/Unicode, http://unicode-table.com/ru/search/?q=55296


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Функция Chr()
СообщениеДобавлено: Ср апр 27, 2016 5:10 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
@ZOLO@ писал(а):
Сергейчик, Почему стандартный CHR не устраивает?
И где pokes в твоей функций?
Может поможет https://ru.wikipedia.org/wiki/UTF-8, http://foxtools.ru/Unicode, http://unicode-table.com/ru/search/?q=55296

Стандартный CHR выводит либо ASCII если компилится прога в нём или Юникод типа UTF-16 если компилится прога указанная как Юникод но ни как не в UTF-8,да и в пурике как я понимаю нет возможности указать на стадии компиляции в какой кодировки строка или символы в отличии того же с++(а мне нужны эти данные можно конечно в базу запихать но неудобно)вот и придётся на стадии обработки создавать эти строки,хотя они могли бы быть уже готовыми уже при компиляции программы как в других языках. :roll:
Про pokes я говорю то что если символы через него выводить с выше указанными номерами то он выводит тупо один и тот же код :D ,а почему я не знаю да и ненужны мне пока такие символы как минимум.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Функция Chr()
СообщениеДобавлено: Вс май 01, 2016 9:16 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Сделал такую процедурку
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
;(©) Автор под псевдонимом Сергейчик.
Procedure.s UTF16_ASCII(stroka.s)
!
!mov dword esi,[p.v_stroka]
!CMP byte[esi],0h
!Jz ljjn
!mov dword edi,[p.v_stroka]
!lfgv:
!mov byte al,[esi]
!mov byte[edi],al
!add dword esi,2
!add dword edi,1
!CMP word[esi],0h
!jnz lfgv
!mov word[edi],0h
!ljjn:
 ProcedureReturn stroka
EndProcedure
 


Смысл выкинуть старший ноль из Юникода и получить чистый ASCII и использовать такую строку для тех функций которые работают с ASCII строкой
Пример:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
 
;EnableExplicit
Procedure.s UTF16_ASCII(stroka.s)
!
!mov dword esi,[p.v_stroka]
!CMP byte[esi],0h
!Jz ljjn
!mov dword edi,[p.v_stroka]
!lfgv:
!mov byte al,[esi]
!mov byte[edi],al
!add dword esi,2
!add dword edi,1
!CMP word[esi],0h
!jnz lfgv
!mov word[edi],0h
!ljjn:
 ProcedureReturn stroka
EndProcedure
Define argc.i =0;количество аргументов
Dim argv.s(0):argv(0) = UTF16_ASCII("preambula");их описание в виде указателя на строку
Global buttonn.a=5
;
Global zoom.f=1
;Global Width.i
;Global Height.i
Global tx.I
Global ty.I
Global tz.I
;{;Константы
;opengl
#GL_DEPTH_TEST=$0B71
#GL_CULL_FACE=$0B44
#GL_COLOR_BUFFER_BIT= $00004000
#GL_DEPTH_BUFFER_BIT = $00000100
 
;IncludeFile "glut.pbi"
#GLUT_RGB= $0000
#GLUT_DEPTH = $0010
#GLUT_DOUBLE = $0002
#GL_POINTS=$0000
#GL_LINES=$0001
#GL_LINE_LOOP=$0002
#GL_LINE_STRIP=$0003
#GL_TRIANGLES=$0004
#GL_TRIANGLE_STRIP=$0005
#GL_TRIANGLE_FAN=$0006
#GL_QUADS=$0007
#GL_QUAD_STRIP=$0008
#GL_POLYGON=$0009
#GL_COLOR_BUFFER_BIT=$00004000
#GL_DEPTH_BUFFER_BIT=$00000100
#GL_TEXTURE_2D=$0DE1
;
;MatrixMode
#GL_MODELVIEW=$1700
#GL_PROJECTION=$1701
#GL_TEXTURE=$1702
;
#GL_BLEND=$0BE2
#GL_SRC_ALPHA=$0302
#GL_ONE_MINUS_SRC_ALPHA=$0303
#GL_LIGHT0=$4000
#GL_LIGHTING=$0B50
#GL_COLOR_MATERIAL=$0B57
#GL_ALPHA_TEST=$0BC0
#GL_DEPTH_TEST=$0B71
#GL_LEQUAL=$0203
#GL_LESS=$0201
#GL_SMOOTH=$1D01
#GL_PERSPECTIVE_CORRECTION_HINT=$0C50
#GL_POINT_SMOOTH_HINT=$0C51
#GL_LINE_SMOOTH_HINT=$0C52
#GL_POLYGON_SMOOTH_HINT=$0C53
#GL_FOG_HINT=$0C54
;HintMode
#GL_DONT_CARE=$1100
#GL_FASTEST=$1101
#GL_NICEST=$1102
#GL_LINE_SMOOTH=$0B20
#GL_LINE_STIPPLE=$0B24
; DrawBufferMode
#GL_NONE=0
#GL_FRONT_LEFT=$0400
#GL_FRONT_RIGHT=$0401
#GL_BACK_LEFT=$0402
#GL_BACK_RIGHT=$0403
#GL_FRONT=$0404
#GL_BACK=$0405
#GL_LEFT=$0406
#GL_RIGHT=$0407
#GL_FRONT_AND_BACK=$0408
#GL_AUX0=$0409
#GL_AUX1=$040A
#GL_AUX2=$040B
#GL_AUX3=$040C
;PolygonMode
#GL_POINT=$1B00
#GL_LINE=$1B01
#GL_FILL=$1B02
;;;;;;;;;;;;
;Scintilla
#LexerState_Space =150
#LexerState_Comment=25
#LexerState_Keyword =257
#LexerState_FoldKeyword=177
LoadFont(555,"Tahoma", 20)
;}
Procedure.i HandleError(Result.i,Text$);для обработки ошибок
If Result=0
    MessageRequester("Error",Text$,0)
    End
Else
   ProcedureReturn Result
EndIf
EndProcedure
ProcedureC reSize(w.i,h.i)
  If h=0:h=1:EndIf
  ;Protected Aspectratio.f=w/h
HandleError(glViewport_(0,0,w,h),"Не соответствует задание размера вывода в GLViewPort()")
glMatrixMode_(#GL_PROJECTION);обновить стек матрицы проектирования
glLoadIdentity_();сброс матрицы проектирования
gluPerspective_(45,0,w/h,1000)
;If (w<=h)
  ;glOrtho_(0-w,0+w,0-h,0+h,-10000,10000);объём отсечения(лев-x,прав+x,нижн-y,верхн+y,ближн,дальняя-z)
  ; glOrtho_(-100,100,-100*w/h,100*w/h,-100,100);объём отсечения(лев,прав,нижн,верхн,ближн,дальняя)  
;Else
  ;glOrtho_(0-w,0+w,0-h,0+h,10000,-10000);объём отсечения(лев,прав,нижн,верхн,ближн,дальняя)
 ;glOrtho_(-100*w/h,100*w/h,-100,100,-100,100);объём отсечения(лев,прав,нижн,верхн,ближн,дальняя)  
;EndIf
;gluLookAt_( 0,0,5, 0,0,0, 0,1,0 )
glMatrixMode_(#GL_MODELVIEW);Параметры проектирования
glLoadIdentity_();сброс матрицы проектирования
EndProcedure
Procedure GL_Init();Установка параметров OPEN_GL сцены
glEnable_(#GL_ALPHA_TEST)
glEnable_(#GL_DEPTH_TEST);Разрешить тест глубины
glDepthFunc_(#GL_LESS);Тип теста глубины
glDepthFunc_(#GL_LEQUAL);Тип теста глубины
;glEnable_(#GL_COLOR_MATERIAL);Включить раскраску материалов (новая)
;glEnable_(#GL_LIGHTING);Включить освещение
;glEnable_(#GL_LIGHT0);Включить встроенное освещение (черновое) 0-лампа
    ;glLightfv_(#GL_LIGHT0, #GL_POSITION, pos);
    ;glLightfv_(#GL_LIGHT0, #GL_SPOT_DIRECTION, dir);
    ;glMaterialfv_(#GL_FRONT, #GL_SPECULAR, mat_specular);
    ;glMaterialf_(#GL_FRONT, #GL_SHININESS, 128.0);
glEnable_(#GL_BLEND);Разрешить смешивание
glBlendFunc_(#GL_SRC_ALPHA,#GL_ONE_MINUS_SRC_ALPHA);Тип смешивания
;glShadeModel_(#GL_SMOOTH);Разрешить плавное цветовое сглаживание
;glEnable_(#GL_TEXTURE_2D);Разрешение наложение текстуры
glClearColor_(0.0, 0.0, 0.9, 0.0);задать цвет-фона(Очистка экрана)
glClearDepth_(1.0);Разрешить очистку буфера глубины
glHint_(#GL_POINT_SMOOTH_HINT|#GL_LINE_SMOOTH_HINT|#GL_PERSPECTIVE_CORRECTION_HINT,#GL_DONT_CARE);#GL_FASTEST(производительность)#GL_NICEST(качество),Улучшенные вычисления перспективы #GL_LINE_SMOOTH_HINT Сглаживание линий
 ;GL_BuildFontOutlined ("Comic Sans MS", 0, 0, 0.2) ; build the outlined font
 ;GL_BuildFontBitmapped("Courier New",15,0,0) ; build the bitmapped font
EndProcedure
ProcedureC szena(zadanie.a)
  glClear_(#GL_COLOR_BUFFER_BIT | #GL_DEPTH_BUFFER_BIT);Очистка экрана и буфера глубины
  glLoadIdentity_();
  glPushMatrix_()
  ;
If zadanie=1
  ;glRotatef_(tx,0,1.0,0);rotate around X axis
  ;glRotatef_(ty,1.0,0,0);rotate around Y axis
  ;glRotatef_(tz,0,0,1.0);rotate around Z axis
  glRotatef_(tx, 1.0, 1.0, 1.0) ; rotate around three x,y,z axis
ElseIf zadanie=2
 If GetGadgetText(9)="Вид XZ"
   tx=90
   ty=0
   tz=90
  glRotatef_(90,0,1.0,0);rotate around X axis
  glRotatef_(0,1.0,0,0);rotate around Y axis
  glRotatef_(90, 0, 0, 1.0);rotate around Z axis
ElseIf GetGadgetText(9)="Вид YZ"
   tx=90
   ty=0
   tz=0
  glRotatef_(90,0,1.0,0);rotate around X axis
  glRotatef_(0,1.0,0,0);rotate around Y axis
  glRotatef_(0, 0, 0, 1.0);rotate around Z axis
Else
   tx=0
   ty=0
   tz=0
  glRotatef_(0,0,1.0,0);rotate around X axis
  glRotatef_(0,1.0,0,0);rotate around Y axis
  glRotatef_(0, 0, 0, 1.0);rotate around Z axis
EndIf
Else
glRotatef_(tx,0,1.0,0);rotate around X axis
glRotatef_(ty,1.0,0,0);rotate around Y axis
glRotatef_(tz,0,0,1.0);rotate around Z axis
EndIf
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;$0D17
;glTranslatef_(Width,Height,0);сдвиг
;
 
;glScalef_(zoom,zoom,zoom);Масштаб
  ;glTranslatef_(1.0, 0.0, 0.0)
;glTranslatef_(0.0, 0.0,50);сдвиг
;;;;;;;;;;;;;;;;;;;;;;;;;;
;glScalef_(20,20,20);Масштаб
;glFrustum_(20,20,30,30,40,50)
 
 ;glLineWidth_(1);ширина линии
  ;glColor3f_(0.7,0.9,0.7);белый цвет
 ;glBegin_(#GL_LINES);Каждая пара вершин задает отрезок.
;For i=-360 To 360 Step 1
 ;glVertex3f_(1+i,5-i,1+i):glVertex3f_(10-i,55+i,100-i)
;Next
;glEnd_()
 
   
   ;theta + 1
 
  ;glPushMatrix_() ; Save the original Matrix coordinates
  ;glMatrixMode_(#GL_MODELVIEW)
  ;glRotatef_( theta, 0,0,1.0);
  ;glRotatef_ (theta, 1.0, 0, 0) ; rotate around X axis
  ;glRotatef_ (theta, 0, 1.0, 0) ; rotate around Y axis
  ;glRotatef_ (theta, 1.0, 1.0, 1.0) ; rotate around three x,y,z axis
   
  glutWireTeapot_(0.3)
  glutWireTorus_(0.3,0.4,12,12)
   
  ;theta + 1
  ;If theta > 360
    ;theta = 0
  ;EndIf  
 
  glPopMatrix_()
  glFlush_();очистка стека команд рисования
  glFinish_()
  ;SwapBuffers_(hdc)
  glutSwapBuffers_()
EndProcedure
 
Procedure Keyboard(Key.a,X.l,Y.l)
  Debug Key
   If Key = 27
    End
   EndIf
EndProcedure
Procedure.w MouseWheelDelta()
Protected x.w =((EventwParam()>>16)&$FFFF)
ProcedureReturn (x/120)
EndProcedure
ProcedureC MouseButtonn(button.i,state.i,x.i,y.i)
If state =1;отпускание кнопок мыши
    If button = 0;отпущено левая кнопка
     
    ElseIf button = 1;отпущено колесо
 
    ElseIf button = 2 ;отпущено правая кнопка
     
    EndIf
ElseIf  state = 0;нажатие кнопок мыши
 
    If button = 0;нажата левая кнопка
       buttonn=0
    ElseIf button = 1;нажато колесо
       buttonn=1
    ElseIf button = 2 ;нажата правая кнопка
       buttonn=2
    EndIf
 EndIf
  Debug buttonn
EndProcedure
ProcedureC mouseMove();обработка при нажатии мыши
  If buttonn=0
  tx+1
  szena(1)
EndIf
 
 
 
EndProcedure
Procedure popupmenu()
 
EndProcedure  
 
 
 
ProcedureC init()
 
        ;glEnable_(#GL_DEPTH_TEST);
        ;glEnable_(#GL_CULL_FACE);
 
        ;регистрация вызовов
        ;glutIgnoreKeyRepeat_(1);
        ;glutKeyboardFunc_(@processNormalKeys());
        ;glutSpecialFunc_(@pressKey());
        ;glutSpecialUpFunc_(@releaseKey());
        ;glutMouseFunc_(@MouseButton());
        ;glutMotionFunc_(@mouseMove());
EndProcedure
 
 
 
Procedure forma(argc.i,argv.i)
   DataSection
     WindowName:
    Data.a 72,101,108,108,111,32,87,111,114,108,100,0
   EndDataSection
   DataSection
      SetName_WindowTitle:
     Data.a 72,101,108,108,111,32,72,101,108,108,111,32,0
    EndDataSection
glutInit_(argc,argv);инициализация
glutInitWindowPosition_(300,100);верхний левый угол отображаемого окна
glutInitWindowSize_(800,800);выбираем размер окна
glutInitDisplayMode_(#GLUT_RGB | #GLUT_DEPTH | #GLUT_DOUBLE); режим отображения
window_0.i=glutCreateWindow_(UTF16_ASCII("Hello Wordt"));Создать окно
;glutSetWindowTitle_(?SetName_WindowTitle);Смена заголовка окна
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;регистрация процедур для главного окна ,вызов из главного цикла в glutMainLoop_()
;menu=glutCreateMenu_(@popupmenu());создать всплывающее меню
     ;DataSection
     ; Red:
     ; Data.a 82,101,100,0
    ; EndDataSection
;
         ; glutAddMenuEntry_(?Red,1);
   ; glutAddMenuEntry_("Green",2);
   ; glutAddMenuEntry_("Blue",3);
   ; glutAddMenuEntry_("Cyan",4);
   ; glutAddMenuEntry_("Magenta",5);
   ; glutAddMenuEntry_("Yellow",6);
   ; glutAddMenuEntry_("White",7);
   ; glutAddMenuEntry_("Black",8);
         ; glutAttachMenu_(2);прикрепить меню к правой кнопки
   ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
          glutKeyboardFunc_(@Keyboard());вызов процедуры для клавиатуры
          ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  glutDisplayFunc_(@szena());процедура рендеринга ,вызов 1 раз при reSize для начального отображения
  glutReshapeFunc_(@reSize());вызов процедуры reSize() при изменении размера окна
  glutMouseFunc_(@MouseButtonn());для мыши,если нажаты кнопки мыши
        glutMotionFunc_(@mouseMove());перемещение мыши при нажатых кнопках мыши
        ;glutIdleFunc_(@szena());показ в цикле
        ;
        ;glutTimerFunc_(33,1,1)
        ;
        ;glutIgnoreKeyRepeat(1);
  ;
        ;glutSpecialFunc_(@pressKey());
        ;glutSpecialUpFunc_(@releaseKey());
        ;
 
        ;
 
       
        ;init()
        ;дочерние окно
        window_1= glutCreateSubWindow_(window_0, 0,0,150,150)
  glutDisplayFunc_(@szena());процедура рендеринга ,вызов 1 раз при reSize для начального отображения
        ;регистрация процедур для главного окна
  ;glutIdleFunc_(@szena());показ в цикле
   glutReshapeFunc_(@reSize());вызов при изменении размера окна
   glutMouseFunc_(@MouseButtonn());если нажаты кнопки мыши
   glutMotionFunc_(@mouseMove());перемещение мыши при нажатых кнопках мыши
               
               
        ;init()
GL_Init();начальная установка параметров для OPENGL
glutMainLoop_(); основной цикл
EndProcedure
forma(@argc,@argv())
 



Последний раз редактировалось Сергейчик Чт окт 19, 2017 1:34 am, всего редактировалось 2 раз(а).

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Функции для работы с Utf-8
СообщениеДобавлено: Пт май 06, 2016 2:46 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Сергейчик писал(а):
Так от делать нечего по изучал UTF-8 :roll:
И вот такую функцию написал,выводит символ UTF-8 по номеру от 0 до 2097151(4 байтный UTF-8)
и смотря на биты с номера 55296 по 57343 обнаружил что функция pokes()выводит один и тот же символ,и не выводит 4-байтный utf-8 может ошибка API функции?
PS:Номера 55296 по 57343 функция pokes() выводит вutf-8 с одним кодом, видимо из за того что в utf-16 это пространство для кодирования суррогатных пар(dword).
Далее ждёт усовершенствование и на её базе другая функция :wink:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
 
;(©) Автор под псевдонимом Сергейчик.
ProcedureCDLL$ CHR_UTF8(Nomer.i)
  Protected stroka.s=#Null$
  stroka=LSet(stroka,2,"")
  ;
  !push eax
  !push ebx
  !push edi
  ;
  !mov dword eax,[p.v_Nomer+12]
  !mov dword edi,[p.v_stroka+12]
  ;
  !CMP dword eax,0h
  !je dddw
  !cmp dword eax,127
  !Ja gyhw
  !
  ;//////////////////////////
  ;до (127),1 байтный utf-8
  !mov byte[edi],al
  !jmp dddw
  ;/////////////////////////
  !gyhw:
 !cmp dword eax,2047;от 800h до 10000h 3-х байтный utf-8
  !Ja sddw
  ;
  ;//////////////////////////////////
  ;от 127 до 800h 2-х байтный utf-8
  !mov byte bl,al
  ;===типа обнулить 6-7 бит
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;===========================
  !shr ax,6
  !or byte al,192;C0h
  ;==========;
  !mov byte ah,bl
  !mov word[edi],ax
  !jmp dddw
  ;////////////////////////////////
  !sddw:
 !cmp dword eax,65535;>10000h это уже 4-х байтный utf-8
  !Ja sddfw
  !
  ;//////////////////////////////////////////////////////
  ;3-х байтный utf-8 символ с числом юникода от 800h до 10000h
  !mov byte bl,al
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !mov byte[edi+2],bl
  ;
  !mov word bx,ax
  !shr bx,6
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !shr ax,12
  !or byte al,224
  ;
  !mov byte ah,bl;2-й байт
  !mov word[edi],ax
  !jmp dddw
  ;
  !sddfw:
 ;//////////////////////////////////////////
  ;4-х байтный utf-8 символ с числом юникода от 10000h до 200000h(2097152)
  !mov byte bl,al
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !mov byte[edi+3],bl
  !mov word bx,ax
  !shr bx,6
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  !mov byte[edi+2],bl
  ;
  !mov dword ebx,eax
  !shr ebx,12
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 6-7 бит
  !or byte bl,128;поставить 7 бит
  ;
  !shr eax,18
  !or byte al,240;f0h
  !mov byte ah,bl;2-й байт
  !mov word[edi],ax
  ;////////////////////////////////
  !dddw:
 !pop edi
  !pop ebx
  !pop eax
  ;
  ProcedureReturn stroka
EndProcedure
 



Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вс ноя 26, 2017 5:25 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 552
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Написал такую функцию Chr_UTF16(hislo.l)
Входящий аргумент число, на выходе символ UTF16BE
PS:Стандартная функция не выводит суррогатную пару
при написании для неё кода руководствовался https://en.wikipedia.org/wiki/UTF-16
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
 
;(©) Автор под псевдонимом Сергейчик.
Global simvol.s="  ";буфер для вывода символа
Procedure.s BinMemory(*s,y=1);адрес памяти,количество сканируемых бит и вывод строкой
  Protected string.s=RSet(string,y,"1");создать буфер с количеством выводящих байт
  !mov dword esi,[p.p_s]
  !mov dword edi,[p.v_string]
  !mov eax,[p.v_y];Количество просматриваемых бит
  ;;;;;;;;;;;;;
  !jmp ff
  !tt:
 !cmp eax,0
  !jz xx
  !add edi,2
  !ff:
 !sub dword eax,1
  !BT dword[esi],eax
  !JC tt;Переход, если бит равен 1
  !mov word[edi],30h
  !jmp tt
  !xx:
 ProcedureReturn string
 
EndProcedure
 
Procedure.s Chr_UTF16(hislo.l);Вход число,выход символ UTF16
  !push edi
  !mov dword edi,[v_simvol]
  !mov dword eax,[esp+8]
  ;;======================
  !cmp dword eax,55296;0d800h если меньше то не суррогатная пара
  !jl rrrh
  !cmp dword eax,57343;0dfffh если больше то возможно суррогатная пара
  !ja rrrh1
  ;;===================
  ;;суррогатная пара;;D800h - DFFFh;55296-57343(dec) не кодируется и типа пространство зарезервировано для суррогатной пары?
  !mov dword [edi],0FFFDFFFDh;значение из стандартной функции
  !pop edi
  ProcedureReturn simvol
  ;;====================
  !rrrh:
 !mov dword [edi],eax
  !pop edi
  ProcedureReturn simvol
  !rrrh1:
 !cmp dword eax,65536;10000h если меньше то не суррогатная пара
  !jl rrrh
  !cmp dword eax,1114111;10ffffh если больше то не суррогатная пара
  !ja rrrh
  ;;=======================
  ;;Суррогатная пара в диапазоне 10000h до 10FFFFh =4 байта
  !sub dword eax,10000h;65536;10000h
  !shl dword eax,6;получаем предварительное высокое 10 битное значение(в старшем байте)
  !shr word ax,6;;получаем предварительное низкое 10 битное значение(в младшем байте)
  !or dword eax,0D800DC00h;прибавим 0D800h к старшему байту и 0DC00h к младшему
  ;
  !mov dword [edi],eax
  !pop edi
  ProcedureReturn simvol
EndProcedure
 
;;тест
Chr_UTF16($10437)
Debug BinMemory(@simvol,32)
 
Global s.s=Chr($10437)
Debug BinMemory(@s,32)
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB