Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: Конвертация из UTF-8 в Win1251 Добавлено: 02.02.05 14:52  

Автор вопроса:  Comanche
Для конвертации из UTF-8 в Win1251 использую следующий код:

Public Enum CHARSET
  CS_DOS = 866
  CS_Windows = 1251
  CS_ISO = 28595
  CS_KOI8R = 20866
  CS_UTF7 = 65000
  CS_UTF8 = 65001
End Enum

Public Function ConvertFromUTF8(InBuf As String) As String
  ConvertFromUTF8 = ConvertCharset(InBuf, CS_UTF8, CS_Windows)
End Function

Public Function ConvertCharset(ByVal strString As String, ByVal FromCharset As CHARSET, ByVal ToCharset As CHARSET) As String
  Dim lngLength As Long
  Dim strWideChar As String
  Dim strReturn As String
  Dim lngReturnLength As Long
  Dim dwFlags As Long
  
  If FromCharset = CS_UTF7 Or FromCharset = CS_UTF8 Then
    dwFlags = 0
  Else
    dwFlags = MB_PRECOMPOSED
  End If
  
  lngLength = Len(strString)
  strWideChar = String$(lngLength * 2, Chr$(0))
  strReturn = String$(lngLength * 2, Chr$(0))
  lngReturnLength = MultiByteToWideChar(FromCharset, dwFlags, strString, lngLength, strWideChar, lngLength)
  WideCharToMultiByte ToCharset, 0, strWideChar, lngReturnLength, strReturn, lngLength * 2, ByVal 0, 0
  ConvertCharset = Left$(strReturn, lngReturnLength)
End Function
'
' вызов в коде некоей формы:
'
Text2.Text = ConvertFromUTF8(Text1.Text)
'
' (в Text1 вставляю текст, скопированный из пришедшего мне эл. письма в UTF-8 формате)
'


Работает, но самую первую букву просто отрубает!
Просидел час в Гугле, нашёл "похожие" коды. Скачал. Везде та же самая проблема (для некоторых строк и соответственно некоторых начальных букв). В чём м.б. дело?!

То же самое письмо службой Mail.Ru и программкой "Штирлиц" конвертируется корректно. Т.е. явно проблема в моём коде. Никто не владеет данной темой?

PS: вот точный заголовок "части" этого multipart-сообщения, в которой и содержится закодированный текст:
Content-Type: text/plain; charset="utf-8"; format="flowed"
Content-Transfer-Encoding: 8bit

М.б. дело в этом "flowed"?

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 VladeD



Вопросов: 8
Ответов: 40
 Профиль | | #1 Добавлено: 03.02.05 14:37
Comanche ?
Так в чем же все таки фишка? Этот раздел всегда многих волнует: - так что выкладывай, как вышел из положения ::))
Спасибо

Ответить

Номер ответа: 2
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #2
Добавлено: 03.02.05 17:20
не знаю, я использовал:
' §§§§§§§§§§§§§§§§§§§§§§§§§§ APIs §§§§§§§§§§§§§§§§§§§§§§§§§§
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)

'--------------------------------------------------------------------------------
' Проект     :  OfflineClient
' Процедура  :  UTF8ToWin
' Описание   :  Перевод UTF8 строки в WIN кодировку
' Кем создан :  SNE
' Дата-Время :  09.11.2004-11:56:58
'
' Параметры  :  inString    - Строка в utf8 кодировке
'               lMaxSize    - Максимальный размер строки
'--------------------------------------------------------------------------------
Private Function UTF8ToWin(ByRef inString As String, _
                           ByVal lMaxSize As Long) As String

        If inString = vbNullString Then Exit Function

        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 VBA.Len(iStrSize) Then
            UTF8ToWin = String$(iStrSize - vbNull, 0&;)
            Call CopyMemory(ByVal UTF8ToWin, ByVal hMemLock2, iStrSize - vbNull)
        End If

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


У мня все с первой буквой было ок...

Ответить

Номер ответа: 3
Автор ответа:
 Comanche



Вопросов: 87
Ответов: 459
 Профиль | | #3 Добавлено: 03.02.05 17:27
Thanx!

Ответить

Номер ответа: 4
Автор ответа:
 Abiron



Вопросов: 30
Ответов: 62
 Профиль | | #4 Добавлено: 29.07.08 14:26
У меня ни тот, ни тот код не работает. Первый выдает ошибку на строчке
lngReturnLength = MultiByteToWideChar(FromCharset, dwFlags, strString, lngLength, strWideChar, lngLength)
Вторая просто ничего не изменяет. Какой текст был таким и остался.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам