Листинг 1. Процедуры CodeTableTest и NumberTableTest для совета
254 "Как автоматически определить кодовую таблицу для русских текстов"
Public Sub CodeTableTest _
(bytSourceArray() As Byte, TableTest() As Single)
'
' Вычисление частоты различных кодов
' (для старшей части таблицы 128-255)
'
' ВХОД: bytSourceArray() - байтовый массив кодов символов
' ВЫХОД: TableTest(-1) - общее число символов
' (без учета кодов перевода строки)
' TableTest(0) - общее число кодов 128-255
' TableTest(1) - частота в диапазоне &H80-&H8F
' ...
' TableTest(8) - частота в диапазоне &HF0-&HFF
'===================================
Dim i%, k&, Code%
For i = 0 To 8: TableTest(i) = 0: Next
For k = LBound(bytSourceArray) To UBound(bytSourceArray)
Code = bytSourceArray(k)
If Code <> 10 And Code <> 13 Then
TableTest(-1) = TableTest(-1) + 1
End If
If Code > 127 Then
TableTest(0) = TableTest(0) + 1
i = (Code - 128) \ 16 + 1
TableTest(i) = TableTest(i) + 1
End If
Next
For i = 1 To 8:
TableTest(i) = TableTest(i) / TableTest(0)
Next
End Sub
Public Function NumberTableTest _
(TableTest() As Single, Lpercent As Single) As Integer
'
' Определение номера кодовой таблицы
' ВХОД: TableTest () - см. описание процедуры CodeTableTest
' Lpercent - минимальная доля строчных русских букв
' ВЫХОД: NumberTableTest = 0 - неопределено
' = 1 - DOS (cp866)
' = 2 - Windows (cp1251)
' = 3 - UNIX (KOI-8)
' = 4 - General(ISO 8859-5)
' = 5 - Macintosh
'===================================
NumberTableTest = 0 ' неопределена
If TableTest(7) + TableTest(8) > Lpercent Then
If TableTest(1) > TableTest(5) Then
NumberTableTest = 5 ' Macintosh
Else
NumberTableTest = 2 ' Windows, cp1251
End If
ElseIf TableTest(5) + TableTest(6) > Lpercent Then
NumberTableTest = 3 ' KOI8 (Unix)
ElseIf TableTest(7) + TableTest(3) > Lpercent Then
NumberTableTest = 1 ' DOS (cp866)
ElseIf TableTest(6) + TableTest(7) > Lpercent Then
NumberTableTest = 4 ' ISO 8859-5/General
End If
End Function