|
|
      Работая в среде Windows часто можно столкнуться с проблемой различия кодировок DOS и Winows. Существует достаточно средств декодировки текста, однако, они, как правило, не могут внедряться в Вашу собственную программу. В данной статье описана процедура, выполняющая декодировку DOS-текста в кодировку Windows. Необходимость подобного преобразования чаще всего возникает, когда ваша программа напрямую работает с текстовыми файлами, генерируемими DOS-приложениями.
      Принцип работы программы простой, как дорога. Сначала в массив загружается таблица кодов. Далее функция проверяет каждый символ строки, полученной в качестве аргумента, ищет его в таблице кодов и заменяет на соответствующий. Тут и комментировать нечего. Стоит только обратить Ваше внимание на некоторые моменты.
      При определении кода символа используеться функция AscW(), а не Asc(). Первая функция работает с двухбайтовыми кодами, тогда как вторая - с однобайтовыми. Если в тексте используются исключительно стандартный набор символов английского языка, то разницы между этими функциями не существует, так как используется только младший байт кода. Но в кодировке русских и украинских букв используется два байта, т.е. AscW("Б")<>Asc("Б").
      Заметьте также, что при нахождении нужного кода, цикл прекращается при помощи оператора Exit For. Это стандартный прием, но многие начинающие программисты просто не задумываются, что так можно существенно снизить время исполнения программы.
      В статье опущена бoльшая часть определения кодов символов.        Полный текст функции можно найти по этой ссылке.
      Кстати, пусть меня простят проффесионалы, каждое значение я присваиваю в отдельной строчке для удобства настройки программы под любую другую кодировку.
Public Function DosToWin(ByVal StrTmp As String)
      Dim intLen As Integer
      Dim CharCodes(69, 1) As Long
      Dim chTmp As Long
      Dim i As Integer, j As Integer
      CharCodes(0, 1) = 8240
      CharCodes(1, 1) = 8211
      CharCodes(2, 1) = 8220
      CharCodes(3, 1) = 1033
      CharCodes(4, 1) = 8230
      ...
      CharCodes(0, 0) = 1049
      CharCodes(1, 0) = 1062
      CharCodes(2, 0) = 1059
      CharCodes(3, 0) = 1050
      CharCodes(4, 0) = 1045
      ...
      intLen = Len(StrTmp)
      If intLen = 0 Then
            DosToWin = ""
            Exit Function
      End If
      For i = 1 To intLen
            chTmp = AscW(Mid(StrTmp, i, 1))
            For j = 0 To 69
                  If chTmp = CharCodes(j, 1) Then
                        Mid(StrTmp, i, 1) = ChrW(CharCodes(j, 0))
                        Exit For
                  End If
            Next j
      Next i
      DosToWin = StrTmp
End Function
|
|