Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: UTF-8 Очередной пост Добавлено: 30.05.07 14:49  

Автор вопроса:  Discaprio | ICQ: 4443928 
У меня проблема-необходимо отправить данные в UTF-8, я пересмотрел кучу примеров-но все работает не как надо, а именно:
надо чтобы отправлялось в виде РќРµ сортированные
А он отправляет в виде ANSI cp1251 или в каком то бреду.
Помогите плз.

Ответить

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

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



ICQ: 298826769 

Вопросов: 53
Ответов: 1732
 Профиль | | #1 Добавлено: 30.05.07 17:09
Есть активикс на сайте, работает с кучей кодировок, но с серийником траблы.

Ответить

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



ICQ: 4443928 

Вопросов: 7
Ответов: 37
 Профиль | | #2 Добавлено: 30.05.07 17:53
Есть еще бесплатные открытые библиотеки типа iconv, но их использование нежелаетельно. Т.к. таскать dll с прогой не есть гуд.

Ответить

Номер ответа: 3
Автор ответа:
 Visual Basic .NET 2005 Пиратская версия



Вопросов: 38
Ответов: 190
 Web-сайт: ex3mos.ucoz.ru
 Профиль | | #3
Добавлено: 30.05.07 18:09
ActiveX тоже не есть гуд так как его регистрить надо. А длл-ку можно в ресурсы запихать. Ищете длл-ки :
www.dll.ru

Ответить

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



ICQ: 4443928 

Вопросов: 7
Ответов: 37
 Профиль | | #4 Добавлено: 30.05.07 19:38
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 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


Нашел такую функцию, но работает только перевод из юникода в ansi(проверял получением данных через сокет в utf8 конвертацией и мсгбокс).
Помоему бейсик чтото делает за меня(с конвертацией). Как его послать на три буквы?

Ответить

Номер ответа: 5
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #5
Добавлено: 30.05.07 20:56
StrConv?

Ответить

Номер ответа: 6
Автор ответа:
 Discaprio



ICQ: 4443928 

Вопросов: 7
Ответов: 37
 Профиль | | #6 Добавлено: 31.05.07 15:18
Пытался, нулевой эффект, строки все рвано отправляеются в ansi.... Скока я уже долбаюсь.. Кошмар. Не получается.

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 31.05.07 17:23
Так ты посмотри в отладчике где и какие строки у тебя. Тогда станет понятно, чем лечить.

Ответить

Номер ответа: 8
Автор ответа:
 nguufxm6bo



Вопросов: 0
Ответов: 27
 Профиль | | #8 Добавлено: 01.06.07 02:56
Держи мою dll:
http://moyasvalka.narod.ru/pub/utf8.dll


Private Declare Function WinToUTF8 Lib "utf8.dll" (ByVal u As Long) As String

Private Sub Form_Load()
MsgBox ConvWinUtf("Не сортированные";)
End Sub

Function ConvWinUtf(str As String) As String
ConvWinUtf = WinToUTF8(StrPtr(str))
End Function


Развлекайся.

Ответить

Номер ответа: 9
Автор ответа:
 Discaprio



ICQ: 4443928 

Вопросов: 7
Ответов: 37
 Профиль | | #9 Добавлено: 01.06.07 13:43
Всем спасибо. Решил сам. Проблема была в непонимании что есть utf16 и что есть utf8. Функция что помогла:
Option Explicit
Public Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As String, ByVal lpUsedDefaultChar As Long) As Long
Public Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Const CP_UTF8 = 65001

'Purpose:Convert Utf8 to Unicode
Public Function UTF8_Decode(ByVal sUTF8 As String) As String
   Dim lngUtf8Size      As Long
   Dim strBuffer        As String
   Dim lngBufferSize    As Long
   Dim lngResult        As Long
   Dim bytUtf8()        As Byte
   Dim n                As Long
   If LenB(sUTF8) = 0 Then Exit Function
      
      bytUtf8 = StrConv(sUTF8, vbFromUnicode)
      lngUtf8Size = UBound(bytUtf8) + 1
      On Error GoTo 0
      lngBufferSize = lngUtf8Size * 2
      strBuffer = String$(lngBufferSize, vbNullChar)
      'Translate using code page 65001(UTF-8)
      lngResult = MultiByteToWideChar(CP_UTF8, 0, bytUtf8(0), _
         lngUtf8Size, StrPtr(strBuffer), lngBufferSize)
      'Trim result to actual length
      If lngResult Then
         UTF8_Decode = Left$(strBuffer, lngResult)
      End If
End Function

'Purpose:Convert Unicode string to UTF-8.
Public Function UTF8_Encode(ByVal strUnicode As String, Optional ByVal bHTML As Boolean = True) As String
   Dim i                As Long
   Dim TLen             As Long
   Dim lPtr             As Long
   Dim UTF16            As Long
   Dim UTF8_EncodeLong  As String
   TLen = Len(strUnicode)
   If TLen = 0 Then Exit Function
      Dim lngBufferSize    As Long
      Dim lngResult        As Long
      Dim bytUtf8()        As Byte
      'Set buffer for longest possible string.
      lngBufferSize = TLen * 3 + 1
      ReDim bytUtf8(lngBufferSize - 1)
      'Translate using code page 65001(UTF-8).
      lngResult = WideCharToMultiByte(CP_UTF8, 0, StrPtr(strUnicode), _
         TLen, bytUtf8(0), lngBufferSize, vbNullString, 0)
      'Trim result to actual length.
      If lngResult Then
         lngResult = lngResult - 1
         ReDim Preserve bytUtf8(lngResult)
         UTF8_Encode = StrConv(bytUtf8, vbUnicode)
         End If
   'Substitute vbCrLf with HTML line breaks if requested.
   If bHTML Then
      UTF8_Encode = Replace$(UTF8_Encode, vbCrLf, "";)
   End If
End Function

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #10
Добавлено: 02.06.07 03:24
У ВБ есть проблеммка, он бывает вылетает на функциях преобразования кодировок, советую использовать всем ассемблерную/сишную или PB'шную библиотечку. Пример одной из них:

.486
.model flat, stdcall
option casemap: none

    include     windows.inc
    include     kernel32.inc
    include     oleaut32.inc

    includelib  kernel32.lib
    includelib  oleaut32.lib

.const
    CP_UTF8         equ 65001

.code
DllEntry proc hInststance: DWORD, dwReason: DWORD, dwReserved: DWORD

    xor eax, eax
    inc eax

    ret
DllEntry endp

; ==================================================================================
; Êîíâåðòèðîâàíèå òåêñòà èç UTF8 êîäèðîâêè â Win
; ==================================================================================
UTF8ToWin proc lpText: DWORD
    LOCAL hMem1:    ;DWORD,
          hMem2:    ;DWORD,
          lng:      ;DWORD

    xor edx, edx                                    ; Âû÷èñëÿåì ðàçìåð ïàìÿòè...
    invoke MultiByteToWideChar, CP_UTF8, edx, lpText, -1h, edx, edx
    add eax, eax
    mov lng, eax

    invoke GlobalAlloc, GPTR, eax                   ; Âûäåëÿåì ïàìÿòü
    mov hMem1, eax
                                                    ; Êîíâåðòèì...
    invoke MultiByteToWideChar, CP_UTF8, 0h, lpText, -1h, hMem1, lng
    
    xor edx, edx                                    ; Âû÷èñëÿåì ðàçìåð ïàìÿòè...
    invoke WideCharToMultiByte, CP_ACP, edx, hMem1, eax, edx, edx, edx, edx
    mov lng, eax

    invoke SysAllocStringByteLen, NULL, eax         ; Âûäåëÿåì ïàìÿòü
    mov hMem2, eax

    xor edx, edx                                    ; Êîíâåðòèì...
    invoke WideCharToMultiByte, CP_ACP, 0h, hMem1, -1h, hMem2, lng, 0h, 0h

    invoke GlobalFree, hMem1

    mov eax, hMem2
    ret
UTF8ToWin endp

; ==================================================================================
; Êîíâåðòèðîâàíèå òåêñòà èç Win êîäèðîâêè â UTF8
; ==================================================================================
WinToUTF8 proc lpText: DWORD
    LOCAL hMem1:    ;DWORD,
          hMem2:    ;DWORD,
          lng:      ;DWORD

    mov eax, lpText
    add eax, eax

    invoke GlobalAlloc, GPTR, eax                   ; Âûäåëÿåì ïàìÿòü
    mov hMem1, eax
                                                    ; Êîíâåðòèì...
    invoke MultiByteToWideChar, CP_ACP, 0h, lpText, -1h, hMem1, lng
    
    xor edx, edx                                    ; Âû÷èñëÿåì ðàçìåð ïàìÿòè...
    invoke WideCharToMultiByte, CP_UTF8, edx, hMem1, eax, edx, edx, edx, edx
    mov lng, eax

    invoke GlobalAlloc, GPTR, eax                   ; Âûäåëÿåì ïàìÿòü
    mov hMem2, eax

    xor edx, edx                                    ; Êîíâåðòèì...
    invoke WideCharToMultiByte, CP_UTF8, edx, hMem1, -1h, hMem2, lng, edx, edx

    dec eax
    invoke SysAllocStringByteLen, hMem2, eax
    push eax

    invoke GlobalFree, hMem1
    invoke GlobalFree, hMem2

    pop eax

    ret
WinToUTF8 endp

end DllEntry

Ответить

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



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

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #11
Добавлено: 02.06.07 03:25
ох мля, дурацкие кодировочки :)

.486
.model flat, stdcall
option casemap: none

    include     windows.inc
    include     kernel32.inc
    include     oleaut32.inc

    includelib  kernel32.lib
    includelib  oleaut32.lib

.const
    CP_UTF8         equ 65001

.code
DllEntry proc hInststance: DWORD, dwReason: DWORD, dwReserved: DWORD

    xor eax, eax
    inc eax

    ret
DllEntry endp

; ==================================================================================
; Конвертирование текста из UTF8 кодировки в Win
; ==================================================================================
UTF8ToWin proc lpText: DWORD
    LOCAL hMem1:    ;DWORD,
          hMem2:    ;DWORD,
          lng:      ;DWORD

    xor edx, edx                                    ; Вычисляем размер памяти...
    invoke MultiByteToWideChar, CP_UTF8, edx, lpText, -1h, edx, edx
    add eax, eax
    mov lng, eax

    invoke GlobalAlloc, GPTR, eax                   ; Выделяем память
    mov hMem1, eax
                                                    ; Конвертим...
    invoke MultiByteToWideChar, CP_UTF8, 0h, lpText, -1h, hMem1, lng
    
    xor edx, edx                                    ; Вычисляем размер памяти...
    invoke WideCharToMultiByte, CP_ACP, edx, hMem1, eax, edx, edx, edx, edx
    mov lng, eax

    invoke SysAllocStringByteLen, NULL, eax         ; Выделяем память
    mov hMem2, eax

    xor edx, edx                                    ; Конвертим...
    invoke WideCharToMultiByte, CP_ACP, 0h, hMem1, -1h, hMem2, lng, 0h, 0h

    invoke GlobalFree, hMem1

    mov eax, hMem2
    ret
UTF8ToWin endp

; ==================================================================================
; Конвертирование текста из Win кодировки в UTF8
; ==================================================================================
WinToUTF8 proc lpText: DWORD
    LOCAL hMem1:    ;DWORD,
          hMem2:    ;DWORD,
          lng:      ;DWORD

    mov eax, lpText
    add eax, eax

    invoke GlobalAlloc, GPTR, eax                   ; Выделяем память
    mov hMem1, eax
                                                    ; Конвертим...
    invoke MultiByteToWideChar, CP_ACP, 0h, lpText, -1h, hMem1, lng
    
    xor edx, edx                                    ; Вычисляем размер памяти...
    invoke WideCharToMultiByte, CP_UTF8, edx, hMem1, eax, edx, edx, edx, edx
    mov lng, eax

    invoke GlobalAlloc, GPTR, eax                   ; Выделяем память
    mov hMem2, eax

    xor edx, edx                                    ; Конвертим...
    invoke WideCharToMultiByte, CP_UTF8, edx, hMem1, -1h, hMem2, lng, edx, edx

    dec eax
    invoke SysAllocStringByteLen, hMem2, eax
    push eax

    invoke GlobalFree, hMem1
    invoke GlobalFree, hMem2

    pop eax

    ret
WinToUTF8 endp

end DllEntry

Ответить

Страница: 1 |

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



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