Как устранить зависание в UTF-8->Win1251 кодировщике?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
qwertyhp
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 156
Зарегистрирован: 07.10.2009 (Ср) 15:02
Откуда: Москва

Как устранить зависание в UTF-8->Win1251 кодировщике?

Сообщение qwertyhp » 04.11.2012 (Вс) 18:31

Здравствуйте!
Пожалуйста, помогите устранить зависание в UTF-8->Win1251 перекодировщике.
Код
Код: Выделить всё
Private Declare Function LocalAlloc Lib "kernel32.dll" (ByVal wFlags As Long, ByVal wBytes As Long) As Long
Private Declare Function LocalFree Lib "kernel32.dll" (ByVal hMem As Long) As Long
Private Declare Function MultiByteToWideChar Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)
Private Const CP_UTF8       As Long = 65001
Private Const LMEM_ZEROINIT As Long = &H40

Private Function UTF8ToWin(ByRef inString As String, _
                           ByVal lMaxSize As Long) As String

        Dim hMemLock1   As Long, hMemLock2  As Long
        Dim iStrSize    As Long

        hMemLock1 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)
        hMemLock2 = LocalAlloc(LMEM_ZEROINIT, lMaxSize)

        iStrSize = MultiByteToWideChar(CP_UTF8, 0&, inString, &HFFFF, hMemLock1, lMaxSize)
        iStrSize = WideCharToMultiByte(0&, 0&, hMemLock1, &HFFFF, hMemLock2, iStrSize, 0&, 0&)

        If Len(iStrSize) Then
            UTF8ToWin = String$(iStrSize, 0&)
            Call CopyMemory(ByVal UTF8ToWin, ByVal hMemLock2, iStrSize)
        End If

        Call LocalFree(hMemLock1)
        Call LocalFree(hMemLock2)
End Function

Private Sub Form_Load()
Dim inString As String

    inString = "Т1 ООО 759.xls"
    outstring = UTF8ToWin(inString, Len(inString))
    MsgBox outstring
    End
End Sub

нашел в Интернете. Корректно работает с кириллицей. Но вот если начать менять значение 'inString' (в UTF-8) на другое (ну, просто - было любое одно, меняем на любое другое) - приложение выдает ошибку, виснет. Подозреваю, что проблема в использовании памяти, но как её устранить - не знаю.
Перекодировщик будет использоваться в почтовой программе после перекодировщика из Base64.
Кракозябры в 'inString = "Т1 ООО 759.xls"' возникли в результате копирования (это кириллица). А так здесь текст в UTF-8.
Пожалуйста, помогите.
Спасибо.
Пятачок Forever! :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как устранить зависание в UTF-8->Win1251 кодировщике?

Сообщение Хакер » 04.11.2012 (Вс) 20:45

Где был взят этот код? Он отвратителен, неописуемо отвратителен.
Откуда взялась супер-гипер-мега-космо-бредовая идея переводить текст из UTF-8 в Win-1251 чтобы потом использовать в VB?

Повальное непонимание сути строк и базовых правил работы с ними просто удручает.

Читать 500 раз.

Перекодировка обсасывалась ТУТ и ТАМ.

Даже не смей тайком от нас, почувствовав скуку, бросить прочтение этих двух топиков, которые ты обязан прочесть от начала и до конца, где-нибудь в середине.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ark
Бывалый
Бывалый
 
Сообщения: 216
Зарегистрирован: 18.07.2011 (Пн) 0:57

Re: Как устранить зависание в UTF-8->Win1251 кодировщике?

Сообщение ark » 23.11.2012 (Пт) 5:50

Интересно, зачем cbMultiByte, например, устанавливать в &HFFFF? Можно что нибудь оригинальнее придумать. 2^2-5 или cos(4*atn(1)) Кстати,
MSDN писал(а):Alternatively, this parameter can be set to -1 if the string is null-terminated.

Особенно порадовало If Len(iStrSize) Then Я б поменял на If Len(iStrSize) <>4 Then MsgBox "Ни фига себе!" И потом - CopyMemory нафига? В WideCharToMultiByte можно напрямую StrPtr(UTF8ToWin) передать.


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

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

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 75

    TopList