Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Алгоритмы перекодировки файла в cp1251




 

Зная кодировку (п.2) можно составить алгоритм перекодировки текста исходной кодировки в заданную-ср1251. Мною были выбраны шесть кодовых таблиц: КОИ-8R, OEM, cp866, ISO, MAC и Unicode.

С первыми пятью кодировками все просто:

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

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...