А в VB есть родные функции для перекодировки WIN <-> D

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
PSV
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 154
Зарегистрирован: 29.01.2002 (Вт) 12:30
Откуда: Россия

А в VB есть родные функции для перекодировки WIN <-> D

Сообщение PSV » 05.10.2004 (Вт) 12:06

Хаюшки!

А в VB есть родные функции для перекодировки WIN <-> DOS (ANSI <-> OEM) типа API-ых CharToOEM, OEMToChar?

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 05.10.2004 (Вт) 12:14

Родных нет (хотя как по мне и CharToOEM, OEMToChar не чужие), но можно правильным алгоритмом организовать замену!
Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.10.2004 (Вт) 13:19

А ведь если по хорошему, то все что через API-это тоже родное.
"Неродное" - это когда используются дополнительные OCX/DLL, не входящие в состав Windows.
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

timsoft
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 181
Зарегистрирован: 18.10.2003 (Сб) 10:50
Откуда: Odessa, Ukraine

Сообщение timsoft » 05.10.2004 (Вт) 13:24

я лет семь назад сам писал функцию, нашел в архиве :-)

может пригодится

Код: Выделить всё
Public Function toWin(S As String) As String
  Dim i As Long, wrk As String, ch As Byte
  wrk = ""
  For i = 1 To Len(S)
    ch = Asc(mid(S, i, 1))
    If ch <= 127 Then wrk = wrk + Chr(ch)
    If ch >= 127 And ch <= 175 Then wrk = wrk + Chr(ch + 64)
    If ch >= 176 And ch <= 191 Then wrk = wrk + Chr(ch)
    If ch >= 192 And ch <= 223 Then wrk = wrk + Chr(ch - 64)
    If ch >= 224 And ch <= 239 Then wrk = wrk + Chr(ch + 16)
    If ch >= 240 And ch <= 255 Then wrk = wrk + Chr(ch - 80)
  Next i
  toWin = wrk
End Function


конвертит из ДОС в ВИН

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.10.2004 (Вт) 14:35

я лет семь назад сам писал функцию, нашел в архиве


На больших строках будут громадные тормоза.
Лучше преобразовать твою функцию (она, кстати, не полный аналог OemToChar) к виду:

Код: Выделить всё
Public Function VbOemToChar(ByVal s As String) As String
    Dim j As Long, i As Long

    For i = 1 To Len(s)
        j = Asc(Mid$(s, i, 1))
        Select Case j
            Case Is <= 127
            Case 128 To 175: Mid$(s, i, 1) = Chr$(j + 64)
            Case 176 To 191: Mid$(s, i, 1) = Chr$(j)
            Case 192 To 223: Mid$(s, i, 1) = Chr$(j - 64)
            Case 224 To 239: Mid$(s, i, 1) = Chr$(j + 16)
            Case Else:       Mid$(s, i, 1) = Chr$(j - 80)
        End Select
    Next i
    VbOemToChar = s
End Function


Тогда хоть разница в скорости будет ~10 раз (в NativeCode)

А вообще я так-же несколько лет назад из интереса писал аналог - мне удалось добиться разницы с OemToChar ~1.5 раза. Но там принцип был на обработке байтового массива...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 05.10.2004 (Вт) 14:38

Да, а вот так еще чуть быстрей:

Public Function VbOemToChar(ByVal s As String) As String
Dim j As Long, i As Long

For i = 1 To Len(s)
j = Asc(Mid$(s, i, 1))
Select Case j
Case Is <= 127
Case Is <= 175: Mid$(s, i, 1) = Chr$(j + 64)
Case Is <= 191: Mid$(s, i, 1) = Chr$(j)
Case Is <= 223: Mid$(s, i, 1) = Chr$(j - 64)
Case Is <= 239: Mid$(s, i, 1) = Chr$(j + 16)
Case Else: Mid$(s, i, 1) = Chr$(j - 80)
End Select
Next i
VbOemToChar = s
End Function
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 1

    TopList  
cron