Visual Basic, .NET, ASP, VBScript
 

   
   
     

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

Страница: 1 |

 

  Вопрос: UTF-8 Добавлено: 02.01.08 23:52  

Автор вопроса:  Winand | Web-сайт: winandfx.narod.ru
Как конвертировать текст в сабж на VB6 и обратно?
И во что конвертирует функа StrConv (флаг vbUnicode)?

Ответить

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

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #1
Добавлено: 03.01.08 02:38
#include <windows.h>

int main(){
wchar_t *s = L"Привет";
char buf[128];
WideCharToMultiByte(CP_UTF8, 0, s, -1, buf, 128, NULL, NULL);
return 0;
}


В UTF-16

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #2
Добавлено: 03.01.08 03:27
Несмотря на то, что это явно Си, а не VB6, и несмотря на то, что utf-16, а не utf-8 (хотя не ясно почему 16, написано же CP_UTF8) все равно спс=)
На самом деле я уже узнал. Всё немножко сложнее (не намного).
Option Explicit
Private Const CP_UTF8 = 65001
Private Const CP_ACP = 0
Private Declare Function GetACP Lib "Kernel32" () As Long
Private Declare Function WideCharToMultiByte Lib "Kernel32" (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, lpUsedDefaultChar As Long) As Long
Private Declare Function MultiByteToWideChar Lib "Kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long

Private Function WToA(ByVal st As String, Optional ByVal cpg As Long = -1, Optional lFlags As Long = 0) As String
    Dim stBuffer As String
    Dim cwch As Long
    Dim pwz As Long
    Dim pwzBuffer As Long
    Dim lpUsedDefaultChar As Long
    
    If cpg = -1 Then cpg = GetACP()
    pwz = StrPtr(st)
    cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, 0&, 0&, ByVal 0&, ByVal 0&;)
    stBuffer = String$(cwch + 1, vbNullChar)
    pwzBuffer = StrPtr(stBuffer)
    cwch = WideCharToMultiByte(cpg, lFlags, pwz, -1, pwzBuffer, Len(stBuffer), ByVal 0&, ByVal 0&;)
    WToA = Left$(stBuffer, cwch - 1)
End Function

Private Function AToW(ByVal st As String, Optional ByVal cpg As Long = -1, Optional lFlags As Long = 0) As String
    Dim stBuffer As String
    Dim cwch As Long
    Dim pwz As Long
    Dim pwzBuffer As Long
        
    If cpg = -1 Then cpg = GetACP()
    pwz = StrPtr(st)
    cwch = MultiByteToWideChar(cpg, lFlags, pwz, -1, 0&, 0&;)
    stBuffer = String$(cwch + 1, vbNullChar)
    pwzBuffer = StrPtr(stBuffer)
    cwch = MultiByteToWideChar(cpg, lFlags, pwz, -1, pwzBuffer, Len(stBuffer))
    AToW = Left$(stBuffer, cwch - 1)
End Function

Public Function EncodeUTF8(ByVal cnvUni As String) As String
    If cnvUni = vbNullString Then Exit Function
    EncodeUTF8 = StrConv(WToA(cnvUni, CP_UTF8), vbUnicode)
End Function

Public Function DecodeUTF8(ByVal cnvUni As String) As String
    If cnvUni = vbNullString Then Exit Function
    ;DecodeUTF8 = AToW(WToA(cnvUni, CP_ACP), CP_UTF8)
End Function

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #3
Добавлено: 03.01.08 04:26
Спааааать!!! Долго мучился непонимая почему работает не так как надо. Потом обнаружил, что в конце сохраненного файла куча нулевых символов.

Несмотря на всё уважение к автору кода
http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=44569&lngWId=1
Вношу исправление (и иду спааать):
Public Function EncodeUTF8(ByVal cnvUni As String) As String
    If cnvUni = vbNullString Then Exit Function
    Dim cnvAns As String
    cnvAns = WToA(cnvUni, CP_UTF8)
    EncodeUTF8 = Mid(StrConv(cnvAns, vbUnicode), 1, Len(cnvAns))
End Function

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #4
Добавлено: 03.01.08 12:39
Ты не понял моего ответа. Код переводит из виндового юникода (который ниже указан, как ответ на твой второй вопрос, UTF-16, и который используется внутре vb6) в UTF-8.

Ответить

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



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #5
Добавлено: 03.01.08 16:51
Разве для символов с кодами от 0000 до FFFF UTF-8 и UTF-16 не совпадают? С чем то там UTF-16 совпадает в этом диапазоне)) Но судя по всему не с восьмеркой..

Ответить

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


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #6
Добавлено: 04.01.08 08:16
Для символов из cp1251 точно не совпадают

Ответить

Страница: 1 |

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



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