p align="left">1. Выбрать из строки поочередно каждый символ. 2. Определить код символа заданной кодировки. 3. Добавить (отнять) к коду разницу от кода такого же символа в кодировке 1251. 4. Определить символ по полученному новому коду. 5. Добавить полученный символ в новую строку. Подпрограмма выбора варианта перекодировки (КОИ-8R, 1251, OEM, 866, MAC, Unicode): Sub Decoder(Fmas() As String, IndxCP As Integer, r As Integer, Smas() As String) Dim i As Integer Dim n As Integer Dim Stroka As String Dim OutStr As String Dim smb As String Dim code As Byte If IndxCP = 1 Then Exit Sub 'если кодировка cp1251, то выход из процедуры без перекодирования If IndxCP = 6 Then Call DecUnicodeTo1251(Fmas, Smas) Exit Sub End If ReDim Smas(r - 1) For i = 0 To r - 1 Stroka = Fmas(i) OutStr = "" For n = 1 To Len(Stroka) smb = Mid(Stroka, n, 1) code = Asc(smb) Select Case IndxCP Case 0 OutStr = OutStr & Chr(cpKoiTo1251(code)) Case 2 OutStr = OutStr & Chr(cpOEMTo1251(code)) Case 3 OutStr = OutStr & Chr(cp866To1251(code)) Case 4 OutStr = OutStr & Chr(cpMACTo1251(code)) Case 5 OutStr = OutStr & Chr(cpISOTo1251(code)) End Select Next n Smas(i) = OutStr Next i End Sub С Unicode немного сложнее: · В начало текста (Unicode) добавляется два символа «я» и «ю». Их нужно удалить. · Перекодировать нужно только первый байт, во втором байте всегда 04. · Символы такие как «точка», «запятая» и другие, кодируются в памяти двумя байтами, но второй байт будет пустой. 1. Выбрать из строки поочередно каждый символ и определить его код. 2. Выбрать следующий за ним символ и определить его код. 3. Если первый байт не равен 4, а второй байт равен 4, то первый байт Unicode перекодируется в cp1251. 4. Иначе если первый байт не равен 4 и второй байт не равен 4, то перекодировка не требуется. 5. Добавить полученный символ в новую строку. Подпрограмма обработки текста кодированного в Unicode для перекодировки в cp1251: Sub DecUnicodeTo1251(TextUnicode() As String, Text1251() As String) Dim i As Integer Dim n As Integer Dim fstr As String Dim smb1 As String * 1 Dim smb2 As String * 1 Dim code1 As Byte Dim code2 As Byte Dim OutStr As String 'В тексте кодированном в cpUnicode в начале добавляется два символа "ю" и "я" 'Поэтому их надо удалить fstr = Right(TextUnicode(0), Len(TextUnicode(0)) - 2) 'удаление символов "ю" и "я" TextUnicode(0) = fstr For i = 0 To UBound(TextUnicode) OutStr = "" For n = 1 To Len(TextUnicode(i)) smb1 = Mid(TextUnicode(i), n, 1) code1 = Asc(smb1) smb2 = Mid(TextUnicode(i), n + 1, 1) code2 = Asc(smb2) 'Проверка по двум байтам: 'Если второй байт равен 4, то первый байт Unicode перекодируется в cp1251 If (code1 <> 4 And code2 = 4) Then OutStr = OutStr & Chr(cpUnicodeTo1251(code1)) 'Если первый байт не равен 4, то символ ASCII, и не требует перекодировки If (code1 <> 4 And code2 <> 4) Then OutStr = OutStr & Chr(code1) Next n ReDim Preserve Text1251(i) Text1251(i) = OutStr Next i End Sub Функции перекодировки кода заданной кодировки в код ср1251: 'перекодирование кода символа из cpКОИ-8R в cp1251 Function cpKoiTo1251(code As Byte) As Byte Dim c As Byte c = code Select Case code |
Case 225 To 226 c = code - 33 Case 228 To 229 c = code - 32 Case 233 To 240 c = code - 33 Case 242 To 245 c = code - 34 Case 193 To 194 c = code + 31 Case 196 To 197 c = code + 32 Case 201 To 208 c = code + 31 Case 210 To 213 c = code + 30 Case 221 c = 249 Case 223 c = 250 Case 217 c = 251 Case 216 c = 252 Case 220 c = 253 Case 192 c = 254 | Case 247 c = 194 Case 231 c = 195 Case 179 c = 168 Case 246 c = 198 Case 250 c = 199 Case 230 c = 212 Case 232 c = 213 Case 227 c = 214 Case 254 c = 215 Case 251 c = 216 Case 163 c = 184 Case 214 c = 230 Case 218 c = 231 Case 198 c = 244 | Case 253 c = 217 Case 255 c = 218 Case 249 c = 219 Case 248 c = 220 Case 252 c = 221 Case 224 c = 222 Case 242 c = 223 Case 215 c = 226 Case 199 c = 227 Case 195 c = 246 Case 222 c = 247 Case 219 c = 248 Case 200 c = 245 Case 209 c = 255 | | |
End Select cpKoiTo1251 = c End Function 'перекодирование кода символа из cpOEM в cp1251 Function cpOEMTo1251(code As Byte) As Byte Dim c As Byte c = code Select Case code |
Case 161 c = 192 Case 163 c = 193 Case 236 c = 194 Case 173 c = 195 Case 167 c = 196 Case 169 c = 197 Case 133 c = 168 Case 234 c = 198 Case 244 c = 199 Case 184 c = 200 Case 190 c = 201 Case 199 c = 202 Case 209 c = 203 Case 211 c = 204 Case 213 c = 205 Case 215 c = 206 Case 221 c = 207 Case 226 c = 208 Case 228 c = 209 Case 181 c = 245 Case 164 c = 246 Case 251 c = 247 | Case 230 c = 210 Case 232 c = 211 Case 171 c = 212 Case 182 c = 213 Case 165 c = 214 Case 152 c = 215 Case 246 c = 216 Case 250 c = 217 Case 238 c = 218 Case 242 c = 219 Case 159 c = 220 Case 248 c = 221 Case 170 c = 244 Case 249 c = 249 Case 237 c = 250 Case 241 c = 251 Case 158 c = 252 Case 247 c = 253 Case 150 c = 254 Case 222 c = 255 Case 231 c = 243 Case 245 c = 248 | Case 157 c = 222 Case 224 c = 223 Case 160 c = 224 Case 162 c = 225 Case 235 c = 226 Case 172 c = 227 Case 166 c = 228 Case 168 c = 229 Case 132 c = 184 Case 233 c = 230 Case 243 c = 231 Case 183 c = 232 Case 189 c = 233 Case 198 c = 234 Case 208 c = 235 Case 210 c = 236 Case 212 c = 237 Case 214 c = 238 Case 216 c = 239 Case 225 c = 240 Case 227 c = 241 Case 229 c = 242 | | |
End Select cpOEMTo1251 = c End Function 'перекодирование кода символа из cp866 в cp1251 Function cp866To1251(code As Byte) As Byte Dim c As Byte c = code Select Case code Case 128 To 175 c = code + 64 Case 224 To 239 c = code + 16 Case 240 c = 168 Case 241 c = 184 End Select cp866To1251 = c End Function 'перекодирование кода символа из Unicode в cp1251 Function cpUnicodeTo1251(code As Byte) As Byte Dim c As Byte c = code Select Case code Case 16 To 79 c = code + 176 Case 1 c = 168 Case 81 c = 184 End Select cpUnicodeTo1251 = c End Function 'перекодирование кода символа из cpMAC в cp1251 Function cpMACTo1251(code As Byte) As Byte Dim c As Byte c = code Select Case code Case 128 To 159 c = code + 64 Case 224 To 254 c = code Case 221 c = 168 Case 222 c = 184 Case 223 c = 255 End Select cpMACTo1251 = c End Function 'перекодирование кода символа из cpISO в cp1251 Function cpISOTo1251(code As Byte) As Byte Dim c As Byte c = code Select Case code Case 176 To 239 c = code + 16 Case 160 c = 168 Case 240 c = 184 End Select cpISOTo1251 = c End Function 4. Алгоритм сортировки записей исходного файла Задача сортировки файла формулируется следующим образом. Имеется файл, состоящий из последовательности записей. Одно из полей в составе каждой записи является полем ключа. Файл целиком размещается во внутренней памяти. Требуется вывести файл на внешний носитель так, чтобы записи располагались в заданном порядке следования ключей.
Страницы: 1, 2, 3, 4
|