purebasic.info

PureBasic forum
Текущее время: Сб дек 16, 2017 12:27 am

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




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Процедура перекодировки UTF16 в Utf8
СообщениеДобавлено: Сб сен 16, 2017 10:12 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 545
Благодарил (а): 2 раз.
Поблагодарили: 30 раз.
Пункты репутации: 9
Единственно не учитывает символы utf16 которые больше 2байт и тупо этот участок символов перекодирует как как 2 байтный utf16. :roll:
Код:
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
 
;(©) Автор под псевдонимом Сергейчик
Procedure.s UTF16_UTF8(stroka.s,a.a)
  ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  ;создать буфер для приёма
  If a=3
    stroka=LSet(stroka,Len(stroka),"")
  ElseIf a=4
    stroka=LSet(stroka,Len(stroka),"")
  EndIf
  ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  !push eax
  !push ebx
  !push esi
  !push edi
  ;
  !mov dword esi,[p.v_stroka+16]
  !mov dword edi,[p.v_stroka+16]
  !rr:
 !CMP word[esi],0h
  !je ddd
  !cmp word[esi],127
  !Ja gyh
  !
  !mov byte al,[esi]
  !mov byte[edi],al
  !add esi,2
  !add edi,1
  !jmp rr
  !gyh:
 !cmp word[esi],2047;до 10000h 3-х байтный utf-8
  !Ja sdd
  !mov word ax,[esi]
  !mov word bx,ax
  !shr ax,6;cdvig na 6 v pravo
  !or byte al,192;C0h
  ;==========;типа обнулить 6-7 бит
  ;!shl bl,2
  ;!shr bl,2
  ;===========================
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  ;
  !mov byte ah,bl
  !mov word[edi],ax
  !add esi,2
  !add edi,2
  !jmp rr
 
  !sdd:
 !cmp dword[esi],65535;10000h это уже 4-х байтный utf-8
  !Ja sddf
  !
  ;
  !;3-х байтный utf-8 символ с число юникода >2047
  !mov word ax,[esi]
  !mov word bx,ax
  !
  ;!shl bl,2
  ;!shr bl,2
  ;!add byte bl,128;80h поставить 7 бит
  !And byte bl,63;обнулить 5 начальных битов
  !or byte bl,128;поставить 7 бит
  ;
  !mov word[edi+2],bx
  ;
  !mov word bx,ax
  !shr ax,12
  !or byte al,224
  ;
  !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 ah,bl
  ;
  !mov word[edi],ax
  !add esi,2
  !add edi,3
  !jmp rr
  ;
  !sddf:
 ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  ;4-х байтный utf-8 символ с числом юникода от 10000h до 200000h(2097152)
  !mov byte bl,[esi]
  ;!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,[esi]
  !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,[esi]
  !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 бит
  ;
  !mov dword eax,[esi]
  !shr eax,18
  !or byte al,240;f0h
  !mov byte ah,bl;2-й байт
  !mov word[edi],ax
  !add esi,2
  !add edi,4
  !jmp rr
  ;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  !ddd:
 !mov byte[edi],0h
  ;
  !pop edi
  !pop esi
  !pop ebx
  !pop eax
  ;
  ProcedureReturn stroka
EndProcedure
 



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

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


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

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


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

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